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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хитрый синтаксис, посоветуйте решение 
V
    Опции темы
BSCheshir
Дата 21.11.2012, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



подскажите, есть ли методы, позволяющие реализовать такое поведение для произвольного числа параметров
Код

    function f1($name='instance',$params=Array()){
        list($p1,$p2,$p3,$p4)=$params;
        return f2($p1,$p2,$p3,$p4);
    }
function f2(){
...
}

где f2 может быть любой функцией (т.е. внутрь для решения задачи не лазим)

Это сообщение отредактировал(а) BSCheshir - 21.11.2012, 16:03
PM MAIL   Вверх
Sanchezzz
Дата 21.11.2012, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Не совсем ясно что вы хотите.. Вы хотите реализовать выполнение в F1 произвольную функцию через параметр? 
Это называется анонимные функции в 5.3+
Цитата

подскажите, есть ли методы, позволяющие реализовать такое поведение для произвольного числа параметров

для создания функций с переменным количеством N Аргументов есть функция func_get_args() В 5.3 версии есть приятные изменения которых раньше не было



Это сообщение отредактировал(а) Sanchezzz - 21.11.2012, 16:37


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


Новичок



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

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



нет, я хочу передать функции набор параметров, который предоставлен в массиве
Код

$params=Array($val1,'13hyzt',$val2,42)
list($p1,$p2,$p3,$p4)=$params;
f2($p1,$p2,$p3,$p4);


и спрашиваю: есть ли методы, позволяющие реализовать такое поведение для произвольного числа параметров?

чтобы понятнее - существует ли какой-нить такой синтаксис: 
Код

 f2(func_set_args($params));

или
Код

func_set_args('f2',$params);


Код

call_user_func('f2',$params);



Называется - задай правильно вопрос - получишь в нём ответ
Код

call_user_func_array('f2',$params);


вот. это, теоретически, оно  smile  smile 
Код

    function f1($name='instance',$params=Array()){
        return call_user_func_array('f2',$params);
    }
function f2(){
...
}


Так, а теперь осталось вспомнить, что надо не функцию вызвать, а создать экземпляр класса smile)) Как тут быть?
Код

    public static function factory($name='instance',$params=Array()){
        list($p1,$p2,$p3,$p4)=$params;
        return self::$_instance_list[$name] = new self($p1,$p2,$p3,$p4);
    }


Это сообщение отредактировал(а) BSCheshir - 21.11.2012, 17:36
PM MAIL   Вверх
Aliance
Дата 21.11.2012, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

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



PM MAIL WWW ICQ Skype   Вверх
BSCheshir
Дата 21.11.2012, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нет, не extract

Код

return self::$_instance_list[$name] = call_user_func_array(Array(get_called_class(),new self),$params);

Код

return self::$_instance_list[$name] = call_user_func_array(Array(get_called_class(),'__construct'),$params);


что-то наподобие такого должно по идее быть


о. или этого.
ReflectionMethod::invokeArgs()


You can't call the constructor of $class like this:
Код

call_user_func_array (new $class, $args);


That's no valid callback as first parameter. Let's pick this apart:
Код

call_user_func_array (new $class, $args);

Is the same as
Код

$obj = new $class;
call_user_func_array ($obj, $args);


Это сообщение отредактировал(а) BSCheshir - 21.11.2012, 22:05
PM MAIL   Вверх
Fortop
Дата 21.11.2012, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

class C {
    public function setParams() {
    }
}


$c = new C
$c->setParams($args);



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Sanchezzz
Дата 22.11.2012, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Мне такое чувство что вы пытаетесь создать второй Underscore.php


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


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


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

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



http://ru2.php.net/manual/en/reflectioncla...nstanceargs.php

Код

$rc = new ReflectionClass('SomeClass');
$class = $rc->newInstanceArgs(array('foo', 'bar'));
 
echo $class->doSomething();

откуда-то из недр php.net


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


Новичок



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

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



ksnk, вот он - метод моей мечты  smile

Есть некоторые ограничения, но... Оно  smile

в итоге получилось чуть сложнее
Код

...
    protected static $_instance_list = array(); 

    public static function factory($name='instance',$params=Array()){
        $called_class=get_called_class();
        $rc = new ReflectionClass($called_class);
        if ($rc->getConstructor())
            return $called_class::$_instance_list[$name] = $rc->newInstanceArgs($params);
        else
            return $called_class::$_instance_list[$name] = new $called_class;
    }
...


 Sanchezzz, ну разве что в этой части
Код


  // Singleton
  private static $_instance;
  public function getInstance() {
    if(!isset(self::$_instance)) {
      $c = __CLASS__;
      self::$_instance = new $c;
    }
    return self::$_instance;
  }



Это сообщение отредактировал(а) BSCheshir - 22.11.2012, 13:44
PM MAIL   Вверх
Fortop
Дата 22.11.2012, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



BSCheshir, вы можете привести вменяемый пример использования этого конструкта?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
BSCheshir
Дата 23.11.2012, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Fortop, ещё и вменяемый? Он же и так красивый, зачем вменяемый? Ну, щас попробуем изобразить

Код

abstract class Atom_class {
    protected static $_instance_list = array(); 
    public static function factory($name='instance',$params=Array()){
        $called_class=get_called_class();
        $rc = new ReflectionClass($called_class);
        if ($rc->getConstructor())
            return $called_class::$_instance_list[$name] = $rc->newInstanceArgs($params);
        else
            return $called_class::$_instance_list[$name] = new $called_class;
    }
}

Some_class extends Atom_class{
    protected $enebled=true;
    function doSomething(){
        if (isset($this->_instance_list)&&is_array($this->_instance_list)&&count($this->_instance_list))
            foreach ($this->_instance_list as $_key=>$_value)
                $_value->close();
    }
    Function Close(){
        $this->enebled=false;
    }
}

Another_class extends Atom_class {
    function __construct(){
        $params=funct_get_args();
        if (isset($params)&&is_array($params)&&count($params))
            foreach ($params as $_key=>$_value)
                $this->'p_'.$_key=$_value;
    }
    function save_all(){
        if (isset($this->_instance_list)&&is_array($this->_instance_list)&&count($this->_instance_list))
            foreach ($this->_instance_list as $_key=>$_value)
                $_value->save();    
    }
    function save(){}
}

Some_class::factory();
Some_class::factory('some_exemplar',Array('12',12312,$some_val))->doSomething();

Another_class::factory($i++,Array('hrr!','vrr!','mur!','varh!');
Another_class::factory($i++,Array('rr','aa','uu','!!');
Another_class::factory()->save_all();


Это сообщение отредактировал(а) BSCheshir - 23.11.2012, 11:59
PM MAIL   Вверх
Fortop
Дата 23.11.2012, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(BSCheshir @  23.11.2012,  11:24 Найти цитируемый пост)
 Он же и так красивый, зачем вменяемый? 

Ну я не увидел смысла в этой фабрике.
Красоты соответственно.





--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ksnk
Дата 24.11.2012, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Fortop, Какая разница? 
Вызвать конструктор объекта с определенным числом параметров, или функцию объекта, с тем-же числом параметров, предварительно вызвав его конструктор без параметров. 
Во втором случае нам нужен специфический класс, который позволит с собой так поступить, а в первом - любой. В каком месте более некрасиво?




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


Эксперт
****


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

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



ksnk, ничерта не понял smile

Код

$someClass = new SomeClass(array('12',12312,$some_val));
$someClass->doSomething();

$anotherClass  = new AnoterClass(array('rr','aa','uu','!!'));
$anotherClass->doAnotherthing();


Цитата(ksnk @  24.11.2012,  10:19 Найти цитируемый пост)
Во втором случае нам нужен специфический класс, который позволит с собой так поступить, а в первом - любой. В каком месте более некрасиво?

Т.е. ты настаиваешь на том, что второй случай более красив при том, что он же и более ограничен?



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ksnk
Дата 25.11.2012, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Присмотрелся, наконец, к коду BSCheshir, и тоже не понял смысла 

Fortop, Мои рассуждения касались другого случая. Решается задача создания объекта по имени и известному набору параметров. Если пользоваться ReflectionClass, ее можно решить для любых классов(первый случай). Если не пользоваться - только для специально под это заточенных( второй).




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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