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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передать в конструктор массив параметров? 
:(
    Опции темы
Чучмек
Дата 20.8.2013, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Как передать в конструктор  класса массив параметров?
Наподобие call_user_func_array.
Не охота через eval извращаться. 


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
ksnk
Дата 21.8.2013, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(Чучмек @  20.8.2013,  23:16 Найти цитируемый пост)
Как передать в конструктор  класса массив параметров?

А это не ответ на вопрос?  smile

Добавлено через 1 минуту и 20 секунд
В смысле - передавай ассоциативный массив и будет щасте, не?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Чучмек
Дата 21.8.2013, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Невкусно.



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Arantir
Дата 21.8.2013, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

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



И откуда у людей вечно берутся подобные проблемы? =)

Цитата(Чучмек @  20.8.2013,  22:16 Найти цитируемый пост)
Наподобие call_user_func_array.

Хм... Может это call_user_func_array?  smile 

Цитата(Чучмек @  21.8.2013,  00:31 Найти цитируемый пост)
Невкусно.
О, мсье знает толк в извращениях  © Из анекдота

http://www.php.net/manual/en/book.reflection.php

ReflectionFunction::__construct ( mixed $name )
ReflectionFunction::invokeArgs ( array $args )

Но reflection - это усегда минус в перфоменсе...


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Чучмек
Дата 21.8.2013, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Arantir, спасибо. 
Код

class myClass
  {
  var $args;
  public function __construct()
    {
    $this->args = func_get_args();
    }
  public function show()
    {
    var_dump($this->args);
    }
  }

$m = array(1,2,3);  
$myClassR = new ReflectionClass('myClass');
$myObj = $myClassR->newInstanceArgs($m);

$myObj->show();




--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
ksnk
Дата 21.8.2013, 07:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Код

class myClass
  {
  var $args;
  public function __construct($args)
    {
    $this->args =$args;
    }
  public function show()
    {
    var_dump($this->args);
    }
  }
$m = array(1,2,3);  
$myObj= new myClass($m);
$myObj->show();


C рефлекцией точно-точно вкуснее. Очевидно же!  smile 

Класс же явно самодельный, почему бы его не откорректировать?


Это сообщение отредактировал(а) ksnk - 21.8.2013, 07:21


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Чучмек
Дата 21.8.2013, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Цитата(ksnk @  21.8.2013,  07:02 Найти цитируемый пост)
C рефлекцией точно-точно вкуснее. Очевидно же!  smile 

Что я на этом теряю?

Цитата(ksnk @  21.8.2013,  07:02 Найти цитируемый пост)
Класс же явно самодельный, почему бы его не откорректировать?

Может и так. 


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
ksnk
Дата 21.8.2013, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(Чучмек @  21.8.2013,  16:55 Найти цитируемый пост)
Что я на этом теряю?

Эффективность. Просто выполни достаточное количество инициализаций в первом случае и во втором. Оплучится проигрыш во времени исполнения, хотя и не  катастрофический, но на большом количестве повторений - заметный.

Юзабилити. Для работы с таким классом ОБЯЗАТЕЛЬНО нужно будет использовать рефлекшн, а это отпугивает нормальных разработчиков  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sanchezzz
Дата 21.8.2013, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Иногда без рефлекшина и не обойтись) 


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
ksnk
Дата 21.8.2013, 21:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Sanchezzz, Когда, например? Я могу себе представить только тестирование, документирование, диагностика отладочных и ошибочных сообщений. Вот я пытался прикрутить рефлекшн для конструирования админки приложения, imho, удачно. Вот только причесать немного код.
То есть чисто служебные надобности. 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sanchezzz
Дата 21.8.2013, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Я читал этот топик)
Например для получения пути вызванного класса отнаследованного от Modules

Код

class Module extends ExtendBaseClass { 

    public
        // Путь к переложению или путь к модулю. 
        $basePath,      
        // Добавочные пути к baseApp 
        $pathController = '/controllers',    
        $pathModule     = '/modules',
        // Имя модуля
        $name;          
    
    public function __construct($config = array()){
        $this->setBasePath($config['basePath']);
    }
    
    /*
    * Функция инициализации для модуля, вызывается при первом подключении к модулю. 
    */
    public function init(){
    
    }
    
    /**
     * Получить basePath
     * basePath используется для запуска контролеров и модулей
     **/
    public function getBasePath(){
        $path = $this->basePath;
        if(empty($path)) 
            throw new CException('В конфигурации переложения не указан параметр basePath');
        return $path;
    }
    
    /**
     * Установить basePath
     **/
    public function setBasePath($path){
        $this->basePath = $path;
    }
    
    /**
     * Запустить указанный контролер 
     * @param $name    Имя контролера
     * @param $action  Имя запускаемого метода 
     * @param $params  Параметры для контролера
     * @see 
     * Можно запустить контроллер из корня для этого в имени контроллера, нужно указать //
     * Каждый / - это уровень директории назад 
    **/
    public function runController($name , $action = 'index' , $params = null ){    
        $result = false;
        $oldBasePath     = $this->getBasePath();
        $name_controller = trim($name,'/');
        $sub_path = str_replace($name_controller , '',  implode('../', explode('/', $name)));
        $baseAppPath  = $this->getBasePath() ."/" . $sub_path ;
        $this->setBasePath($baseAppPath);
        $path  =  $baseAppPath . trim( $this->pathController ,'/' )
            . "/". $name_controller .".php";
            
        if(is_readable($path)){

            include_once $path;            
            $class = $name_controller."_controller";
            if(class_exists($class,false)){            
                $controller = new $class;
                $operation =  (!empty($this->name) ? $this->name . '::' : '')
                              . implode('->',array( $name , $action ));
                              
                $controller->setOperation( $operation );
                $controller->param = $params;
                // Выполнили до
                $controller->before();
                if(method_exists( $controller  , 'action'.$action)){ 
                    $controller->{'action'.$action}();
                }else $result = false;
                // Выполнили после    
                $controller->after();    
                $result = true;    
            }
        }
        $this->setBasePath($oldBasePath);
        return $result;
    }
    
     /*
     * Запуск модуля
     * @param  $name  имя модуля
     * @param  $controller  Контроллер который запускать
     * @param  $action      Метод который нужно запустить
     * @param  $params      Параметры     
     **/
    public function runModule($name , $controller = 'default_main' , $action = 'index', $params = array() ){
        $baseAppPath     = $this->getBasePath();
        // Путь к модулю
        $path = $baseAppPath."/".trim( $this->pathModule ,'/' )."/".$name."/".$name.".php";
        // Список модулей в конфиге 
        $arrModules = Config::get('modules');
        if(is_readable($path) && in_array($name, $arrModules)){
            include_once $path;
            $class = $name."_module";    
            if(class_exists($class,false)){
                // Зададим путь к модулю
                $ref = new ReflectionClass($class);    
                $path = pathinfo( $ref->getFileName(), PATHINFO_DIRNAME);
                $module = new $class( array( 
                    'basePath'=> $path, 
                ));
                
                $module->init();
                // Регистрируем путь для моделей
                Autoload::addPath($path . DIRECTORY_SEPARATOR . "models" );
                // Запуск контролера в модуле
                if(!empty($controller)){
                    $module->name = $name;
                    return $module->runController($controller , $action, $params);
                }        
                return true;
            }    
        }
        return false;
    }
}

Модуль 
Код

classs News extends Module {} 
 
Можно было например заставить пользователя прописать  в  модуле News  в методе init  вот такую штуку 
Код

$this->basePath = dirname(__FILE__);

Но лишние телодвижения, я не люблю делать


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
ksnk
Дата 22.8.2013, 00:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Как то странно  smile сначала вычисляется путь к модулю, инклюдится сам модуль
Код

// Путь к модулю
$path = $baseAppPath."/".trim( $this->pathModule ,'/' )."/".$name."/".$name.".php";
...
include_once $path;


А потом этот же путь, с приписанным к нему каталогом добавляем путь поиска автолода? 
Код

Autoload::addPath($path . DIRECTORY_SEPARATOR . "models" );

При чем тут рефлекшн? Все пути вычисляются статически. Не?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sanchezzz
Дата 22.8.2013, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ага чет я даже и сам не заметил, что можно по логике и без reflection решить, извиняюсь за смуту.  smile 










--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0624 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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