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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сообщить классу строку параметров из массива 
V
    Опции темы
мухр
Дата 19.12.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Имеем класс с переменным имененем. Вызывается, скажем:
Код

$myObject = new $myClassName;

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

Это сообщение отредактировал(а) мухр - 19.12.2007, 12:36
PM WWW   Вверх
мухр
Дата 19.12.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



По типу как call_user_func_array(), но только для создаваемого объекта.
PM WWW   Вверх
Glip
Дата 19.12.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

 $object = $args
    ? new $class($args)
    : new $class();




--------------------
user posted image
PM MAIL   Вверх
мухр
Дата 19.12.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не то. Вы влепляете массив, как он есть, а нужно в виде строки параметров.
То есть:
Код

$args = Array($param1, $param2, $param3);
$object = $class($param1, $param2, $param3);

Понятно, что заведомо мы не знаем, сколько элементов будет в массиве $args.

Это сообщение отредактировал(а) мухр - 19.12.2007, 13:24
PM WWW   Вверх
Glip
Дата 19.12.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



разбирайте в конструкторе класса или вот пример

Код

    abstract class Singleton
    {
        private static $instances = array();
        
        protected function __construct() {/* you can't create me */}
        
        /// @example singleton.php
        final public static function getInstance(
            $class, $args = null /* , ... */
        )
        {
            // for Singleton::getInstance('class_name', $arg1, ...) calling
            if (2 < func_num_args()) {
                $args = func_get_args();
                array_shift($args);
            }
            
            if (!isset(self::$instances[$class])) {
                $object =
                    $args
                        ? new $class($args)
                        : new $class();
                
                Assert::isTrue(
                    $object instanceof Singleton,
                    "Class '{$class}' is something not a Singleton's child"
                );

                return self::$instances[$class] = $object;
            } else
                return self::$instances[$class];
        }
        
        final public static function getAllInstances()
        {
            return self::$instances;
        }
        
        final private function __clone() {/* do not clone me */}
        final private function __sleep() {/* restless class */}
    }




--------------------
user posted image
PM MAIL   Вверх
мухр
Дата 19.12.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну этот пример, я смотрю, тот же самый. Нет, мне не нужно делать дополнительного разбора в конструкторе класса. Мне нужно то, что нужно.
----
Кто модератор? Переносите тему в раздел для экспертов срочно!

Это сообщение отредактировал(а) мухр - 19.12.2007, 13:26
PM WWW   Вверх
Glip
Дата 19.12.2007, 13:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



хм, не дойдет что-то никак.  
то вам нужно по типу call_user_func_array() то $class($param1, $param2, $param3)  перечисляя каждый параметр.

Добавлено через 3 минуты и 15 секунд
я думаю что если класс создается со списком параметров, то у него существует и конструктор разбирающий этот список, то наверняка можно этот список передать и массивом. во всяком случае в php5 это вполне нормально работает.

Добавлено через 6 минут и 54 секунды
не понятно что вам мешает сделать 
Код

$args = Array($param1, $param2, $param3);
$object = new $class($args);


????


--------------------
user posted image
PM MAIL   Вверх
мухр
Дата 19.12.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Короче говоря, нашлось два решения:
http://ru.php.net/manual/ru/function.call-...-func-array.php
Код

    /**
     * Create an object of a specified type using an array as the parameters
     * to the constructor.  NOTE: does not maintain proper 
     * types for the arguments.  They are all converted to strings.
     * @param $type Type type of object to create (class name)
     * @param $args The arguments to pass to the constructor
     */
    function createObjArray($type, $args=array()) {
        if ( !class_exists($type) ) {
            return NULL;
        }
        
        // build argument list; be sure to escape string delimeters
        $func = create_function('$str', 'return str_replace("\'","\\\'",$str);');
        $sargs = "'" . join( "','", array_map($func,$args) ). "'";
        
        // build & eval code; return result
        $seval = "return new $type($sargs);";
        return eval($seval);
    }

Код

function & createObjArray($type, $args = array()) {
    $reflection = new ReflectionClass($type);
    $output     = call_user_func_array(array(&$reflection, 'newInstance'), $args);
    return $output;
}

Первое через eval() - явно кривое и недоработанное.
Но кто может объяснить, как второе работает?
PM WWW   Вверх
skyboy
Дата 19.12.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



Цитата(Glip @  19.12.2007,  12:53 Найти цитируемый пост)
хм, не дойдет что-то никак.  

угу. странно как-то. если же разбор в конструкторе не происходит - просто пихать строку-строкой. если нужна именно строка.
Цитата(мухр @  19.12.2007,  12:23 Найти цитируемый пост)
Кто модератор? Переносите тему в раздел для экспертов срочно!


M
skyboy
вопрос не является каверзным/сложным.  очень надеюсь, что ты не станешь там создавать дубликат темы.

вопрос даже на вопрос не похож, потому как нет информации - что и для чего требуется. потому и нет ответов. 
привел бы пример ожидаемой функциональности.
например, из
Цитата(мухр @  19.12.2007,  12:04 Найти цитируемый пост)
То есть:код PHP1:2:$args = Array($param1, $param2, $param3);$object = $class($param1, $param2, $param3);

неясно, что надо. кроме того, что объект надо создавать не "$object= $class", а "$object= new $class"
PM MAIL   Вверх
мухр
Дата 19.12.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пардон. Кривую не эту имел в виду. Вот эту:
Код

function createObjArray($type,$args=array()) {
     $paramstr = '';
     for ($i = 0; $i < count($args); $i++) {
           $paramstr .= '$args['.$i.'],';
     }
     $paramstr = rtrim($paramstr,',');

     return eval("return new $type($paramstr);");
}

PM WWW   Вверх
Glip
Дата 19.12.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



сдается мне что 
Код

call_user_func_array(array(&$reflection, 'newInstance'), $args);


эквивалентно
Код

  $reflection->newInstance($args);

Код

Note: The method newInstance() accepts a variable number of arguments which are passed to the function just as in call_user_func().



и в свою очередь даст тот же результат что и 
Код

new $type($args);


smile могу конечно ошибаться, но очень похоже

Это сообщение отредактировал(а) Glip - 19.12.2007, 14:13


--------------------
user posted image
PM MAIL   Вверх
мухр
Дата 19.12.2007, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Glip @  19.12.2007,  14:11 Найти цитируемый пост)
могу конечно ошибаться, но очень похоже

А вот и не даст. Подумайте сами, а лучше попробуйте протестить то и другое - сразу будет видна разница.
Вообще данную проблему тут непросто объяснить словами - надо непосредственно испытывать.

Кто задачу сможет сформулировать, чтобы было видно к чему данное решение?
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0612 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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