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

Поиск:

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


Эксперт
****


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

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



Цитата(ksnk @  25.11.2012,  09:54 Найти цитируемый пост)
 Решается задача создания объекта по имени и известному набору параметров. Если пользоваться ReflectionClass, ее можно решить для любых классов(первый случай). Если не пользоваться - только для специально под это заточенных( второй).

Все верно, только я вот сходу плохо могу придумать в каком месте в пхп такая гибкость может потребоваться, возможно просто из-за недостатка опыта в каких-то областях.
А так, как фишка - да.


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


Новичок



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

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



ksnkFortop, спасибо за критику, конечно, но 
1. 
Цитата(ksnk @  25.11.2012,  09:54 Найти цитируемый пост)
Решается задача создания объекта по имени и известному набору параметров.

2. В примере хотел показать создание коллекции экземпляров, для "пакетной" обработки, если что. 
Что конкретно не красиво? 
PM MAIL   Вверх
Fortop
Дата 27.11.2012, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(BSCheshir @  26.11.2012,  13:51 Найти цитируемый пост)
Что конкретно не красиво?

Отсутствие смысла.
Код ведь красив не сам по себе. 

Цитата(BSCheshir @  26.11.2012,  13:51 Найти цитируемый пост)
В примере хотел показать создание коллекции экземпляров, для "пакетной" обработки, если что. 

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

Добавив интерфейс установки параметров скопом, или же задав возможность конструктора класса получать параметры массивом.
Ты сделаешь код более читаемым при той же функциональности.



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


Новичок



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

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



т.е. с твоей точки зрения более красиво то же самое так записать?
Код

abstract class Base_class extends Atom_class implements ISaver {}

interface ISaver{
    public function constructor_emulator();
    public function save();
}

class Some_class extends Base_class {
    public function constructor_emulator(){
        {echo'<pre>Some_class __construct func_get_args() ';var_dump(func_get_args());echo'</pre>';}
    }
    public function __construct(){
        {echo'<pre>Some_class __construct func_get_args() ';var_dump(func_get_args());echo'</pre>';}
    }
    public function save(){
        {echo'<pre>Some_class save $this ';var_dump($this);echo'</pre>';}
    }
}

class Another_class extends Base_class{
    public function constructor_emulator(){}
    public function save(){
        {echo'<pre>Another_class save func_get_args() ';var_dump(func_get_args());echo'</pre>';}
        {echo'<pre>Another_class save $this ';var_dump($this);echo'</pre>';}
    }
     static $_instance_list = array(); 
}

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_exemplar=new Some_class;
$some_exemplar->constructor_emulator();
$some_exemplar->set_params(Array($param1,$param2...))


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


Эксперт
****


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

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



Я выше пример давал

Код

class C {
    public function setParams() {
    }
}
$c = new C
$c->setParams($args);


Но ты невнимательно прочел про параметры массивом
Код

class C {
    public function __construct(array $args) {
    }
}
$c = new C($args);


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

Код

class C {
    public function __construct($arg1 = 'default value', $arg2 = 'default value', $arg3 = 'default value') {
    }
}

$c[0] = new C(1,2);
$c[1] = new C(3);
$c[2] = new C(4,5,6);



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


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


Новичок



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

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



То что не возражаю по всем пунктам - может значить не только то, что невнимательно читаю, но и то, что согласен;) Но раз уж зашел разговор о параметрах в массиве. 

Все отлично, даже более - можно ассоциативным массивом передавать - 
Код

class D {
    public function __construct(array $args) {
        $args=@func_get_arg(0);
        if(isset($args)&&is_array($args)&&count($args))
            extract($args,EXTR_REFS);
...
    }
}
$d = new D($args);


Вопрос в том, что не подходит в применении к уже существующим классам, которые написаны без учёта того, что будет передаватся массив. Или, например, у одного передаётся ассоциативный массив первым параметром, у другого - список аргументов, у третьего - допустим, пусть будет массив из примера.
Цитата(Fortop @  27.11.2012,  12:13 Найти цитируемый пост)
class C {
    public function __construct(array $args) {
    }
}
$c = new C($args);


PM MAIL   Вверх
baldina
Дата 27.11.2012, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



BSCheshir, остался основной вопрос: зачем всё это нужно?  smile 
вы изобрели вариант DI, однако полезность его не очевидна, а в проектах (фреймворках), где DI интенсивно эксплуатируется, есть свои решения, не самые плохие.
PM MAIL   Вверх
Fortop
Дата 27.11.2012, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(BSCheshir @  27.11.2012,  15:06 Найти цитируемый пост)
Вопрос в том, что не подходит в применении к уже существующим классам, которые написаны без учёта того, что будет передаватся массив.

Понятное дело что не подходит.
Я не знаю сколько там у вас легаси кода, но на мой личный взгляд проще привести к общим интерфейсам, да и полезнее в будущем.



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


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


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

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



Fortop, Одно из применений - инициализация классов из файла конфигурации.

К примеру, класс mail, отсылающий сообщения, может быть стандартным mail'ом, SMTP транспортом "через mail-ru-google-com", skype и icq мессенджером и так далее. Инициализация каждого из них требует разных параметров, однако интерфейс всех классов сведен к фабричному mail'у. 
Параметры инициализации нужного транспорта - ассоциативный массив с параметрами в конфиге. С точки зрения юзера - нужно только выбрать нужный транспорт по названию. 

Вполне, на мой взгляд, кошерная схема.


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


Эксперт
****


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

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



Цитата(ksnk @  27.11.2012,  22:47 Найти цитируемый пост)
Fortop, Одно из применений - инициализация классов из файла конфигурации.

Причем чужих классов транспорта
С разнородными сигнатурами.
И нужно это в недрах фреймворка где-то глубоко.
Цитата(Fortop @  27.11.2012,  22:16 Найти цитируемый пост)
Я не знаю сколько там у вас легаси кода, но на мой личный взгляд проще привести к общим интерфейсам, да и полезнее в будущем.



Жаль не нагуглю быстро статью. Там обсуждался вопрос выноса программируемых свойств сущностей в конфиги.
Например, тот же Zend_Form может полностью задаваться в конфигурационном файле.
Но как справедливо говорилось в статье, мы этим просто подменяем программирование в коде, на программирование в конфиге и зачастую не меньшим объемом, но другим синтаксисом...


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


Эксперт
****


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

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



спор о dependency injection сродни религиозному  smile 
PM MAIL   Вверх
Fortop
Дата 28.11.2012, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Лично мне Di удобен в таком варианте

Код

$mail = new Mail (new Smtp($params));

$mail2 = new Mail(new Skype($params));


Так что спора особо не вижу.

P.S. как один из вариантов
http://phemto.sourceforge.net/quick-start.php


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


Новичок



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

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



Fortop, т.е. всё-таки удобнее передавать параметры инициализации в конструктор, да? Или тут от предмета дискуссии зависит? ;)
PM MAIL   Вверх
Fortop
Дата 28.11.2012, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(BSCheshir @  28.11.2012,  13:54 Найти цитируемый пост)
Fortop, т.е. всё-таки удобнее передавать параметры инициализации в конструктор, да? Или тут от предмета дискуссии зависит? ;) 


Вот так удобнее
Цитата(Fortop @  27.11.2012,  22:16 Найти цитируемый пост)
Я не знаю сколько там у вас легаси кода, но на мой личный взгляд проще привести к общим интерфейсам, да и полезнее в будущем.




--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
xoptov
Дата 1.5.2013, 15:02 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(BSCheshir @ 21.11.2012,  16:01)
подскажите, есть ли методы, позволяющие реализовать такое поведение для произвольного числа параметров
Код

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

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

Это не синтакис хитрый, это ты программист никакой...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1411 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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