Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Маршрутизация, Вызов метода класса 
V
    Опции темы
Just123
Дата 23.8.2010, 17:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 9.12.2007
Где: localhost

Репутация: нет
Всего: нет



Здравствуйте, помогите пожалуйста с решением одной проблемы.

Пишу CMS со следующей системой маршрутизации:

URL имеет вид 

http://site.ru/НАЗВАНИЕ_КОМПОНЕНТА/НАЗВАНИЕ_МЕТОДА/ПАРАМЕТР_МЕТОДА1/ПАРАМЕТР_МЕТОДА2/и т.д./

Роутер из URL вытаскивает НАЗВАНИЕ_КОМПОНЕНТА и подгружает его.

Структура компонента:

Код

Class Hello {

     funtcion index() {
             echo "Hello";
     }
 
     function whats_up($var) {
             echo "What up $var?";

    }

}


Подгрузить компонент понятно как, но как вызвать метод компонента?

Надеюсь понятно объяснил, что требуется.   smile 
Заранее больше спасибо за советы и помощь.
PM MAIL   Вверх
StachelDraht
Дата 23.8.2010, 17:22 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Не Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 19.1.2006

Репутация: 1
Всего: 1



может быть проще использовать какой нибудь фрэймворк 
PM MAIL   Вверх
overmetallist
  Дата 23.8.2010, 17:54 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 19.8.2010

Репутация: нет
Всего: нет



вот smile 
Код

$component->whats_up=$callback;

$callback — это корректный callback-вызов PHP 

Yii-приложения состоят из компонентов–объектов, созданных согласно спецификациям. Компонент (component) — это экземпляр класса CComponent или производного от него. Использование компонента в основном включает доступ к его свойствам, а также вызов и обработку его событий. Базовый класс CComponent  устанавливает то, как определяются свойства и события.

Код

$component->whats_up($var);
// выражение ниже приведет к вызову исключения
$component->test();
$component->whats_up($var);
// здесь все будет работать нормально


Это сообщение отредактировал(а) overmetallist - 23.8.2010, 17:57
PM MAIL WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Just123
Дата 23.8.2010, 18:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 9.12.2007
Где: localhost

Репутация: нет
Всего: нет



Цитата

может быть проще использовать какой нибудь фрэймворк 

Это не рабочий проект, пишу ради опыта.


overmetallist, не уверен, что до конца понял :( Можно какой-нибудь пример на пальцах, пожалуйста. В любом случаи, большое спасибо.
PM MAIL   Вверх
bars80080
Дата 23.8.2010, 18:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



посмотрите в сторону call_user_func() или чего-то аналогичного
PM MAIL WWW   Вверх
overmetallist
Дата 23.8.2010, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 19.8.2010

Репутация: нет
Всего: нет



можно и так как предложил bars80080 : smile Проверил, выводит What up ? , замучаю свой хостинг проверками этих всех скриптов smile 
Код

<?php
class Hello {
  function whats_up() 
  {
    echo "What up $var?\n";
  }
}

$classname = "Hello";

call_user_func(array($classname, 'whats_up'));
?>

вот еще намудрил:
Код

<?php
class Hello {
  var $wup;
  const CONST_VALUE = 'What up?';
  function whats_up() 
  {
    echo "What up?\n";
  }
  public function whats($w){
   echo $w;
  }
   public function up(){
   $this->whats("What up?");
  }
}
$classname = "Hello";
call_user_func(array($classname, 'whats_up'));
$object = new Hello;
$object->whats_up();
echo Hello::CONST_VALUE;
$object2 = new Hello;
$object2->up();
?>


Это сообщение отредактировал(а) overmetallist - 23.8.2010, 21:30
PM MAIL WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
littlemook
Дата 24.8.2010, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.8.2010

Репутация: нет
Всего: нет



Цитата(bars80080 @ 23.8.2010,  16:56)
посмотрите в сторону call_user_func() или чего-то аналогичного

Лучше call_user_func_array, удобней параметры подавать цельным массивом smile 
PM MAIL   Вверх
ZneP
Дата 25.8.2010, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 15.7.2008
Где: Россия, Москва

Репутация: нет
Всего: нет



Код

Class Hello {
     funtcion index() {
             echo "Hello";
     }
 
     function whats_up() {
             $num = func_num_args();  // просто так
             $args = func_get_args();  // массив параметров
             foreach($args as $arg)
                echo $arg;
    }
}


// $Component - вытащенное роутером название компонента
// $Module - вытащенное название функции
// $Params - массив параметров, вытащенный роутером из URL
if (class_exists($Component)) {
   $class_obj = new $Component;

   if (function_exists($Module)) {
      $class_obj->$Module(extract($Params));
   }
}


Как-то так я бы сделал


P.S. не тестил, поэтому за extract($Params) не ручаюсь
PM MAIL ICQ Skype   Вверх
gta4kv
Дата 25.8.2010, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Расскажу немножко о своем опыте в этом прискорбном деле.


Была в свое время такая же задача, реализовал я её с помощью ReflectionClass.

Работало все примерно так:
Код

        if( ! $module ) 
        {
            $module = 'page';
        }
        
        $path = path . '/system/modules/' . $module . '.php';
        
        if( file_exists( $path ) ) 
        {
            require_once path . '/system/modules/' . $module . '.php';
            
            if( class_exists( $module ) )
            {
               $shapeClass = new ReflectionClass( $module );
               
               if( ! $shapeClass->implementsInterface( 'iController' ) )
               {
                    $this->error_instance->set( "iController must be implemented to {$module} module." );       
               }
               
               $shapeMethod = $shapeClass->getMethod( 'init' );
               $shapeObject = new $module( );
               $result = $shapeMethod->invoke( $shapeObject, $parms );
            }
        }
        else
        {
            $this->error_instance->set( "{$module} not exists." );
        }    
        


И вот самый просто пример модуля с таким подходом
Код

<?php
class upload implements iController  
{    
    public function init ( $params )
    {
     $default_function = singleton::getInstance( 'config' )->default_function;
     $return = $this->$default_function( ( isset( $params[ 'action' ] ) ? $params[ 'action' ] : '' ) );
     return $return;
    }
    
    private function load( $action )
    {
     switch ( $action )
        {
            case 'test':
                $return = 'lol';
            break;
            default:
                $return = $this->page();
        }   
        return $return;
    }
    
    public function page()
    {
        return 'some content';
    }
}
?>


default_function забита в конфиге, "функция по-умолчанию". (в моем случае -- load).
PM MAIL   Вверх
Just123
Дата 25.8.2010, 22:22 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 9.12.2007
Где: localhost

Репутация: нет
Всего: нет



bars80080,  overmetallist, littlemook, ZneP, gta4kv,  Большое спасибо! 
PM MAIL   Вверх
Just123
Дата 26.8.2010, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 9.12.2007
Где: localhost

Репутация: нет
Всего: нет



Написал следующий метод:
Код

    function route() {
        if (file_exists(APP_ROOT.DS.'components'.DS.$this->class.DS.$this->class.'.php')) {
            include (APP_ROOT.DS.'components'.DS.$this->class.DS.$this->class.'.php');
        } else {
            show_404("$this->class");
        }
        
       if (isset($this->method)) {
            if (!call_user_func(array("$this->class", $this->method))) {
                    show_404("$this->class");  
            }     
       } else {
                call_user_func(array("$this->class", 'index'));
       }
        
       return;   
    }


Правда пока он не принимает аргументов функций.
Подскажите пожалуйста:
1) Как проверить существует функция или нет?
Код

            if (!call_user_func(array("$this->class", $this->method))) {
                    show_404("$this->class");  
            }     


В данном случаи, если функция не существует, появится ошибка:
Warning: call_user_func(News::asd) [function.call-user-func]: First argument is expected to be a valid callback in D:\Web Server\Apache\htdocs\kernel\classes\Route.php on line 49

как избежать появления этой ошибки, без помощи @ ?

2) Как передать аргументы в функцию, если общее количество аргументов не известно?


Это сообщение отредактировал(а) Just123 - 26.8.2010, 01:42
PM MAIL   Вверх
gta4kv
Дата 26.8.2010, 01:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



(скромно намекает) советую испробовать мой вариант, или хотя бы просто заглянуть в код в предыдущем моём посте.

Это сообщение отредактировал(а) gta4kv - 26.8.2010, 01:44
PM MAIL   Вверх
Just123
Дата 26.8.2010, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 9.12.2007
Где: localhost

Репутация: нет
Всего: нет



gta4kv, Я просто не хотел бы использовать по умолчанию отключенные расширения. 


Это сообщение отредактировал(а) Just123 - 26.8.2010, 02:04
PM MAIL   Вверх
gta4kv
Дата 26.8.2010, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Функции class_exists и function_exists доступны по-умолчанию.
PM MAIL   Вверх
Just123
Дата 26.8.2010, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 9.12.2007
Где: localhost

Репутация: нет
Всего: нет



gta4kv, Извиняюсь, проглядел function_exists. Спасибо большое.

Добавлено через 7 минут и 21 секунду
А как быть со вторым вопросом:
Как передать аргументы в функцию, если общее количество аргументов не известно?


PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0606 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.