Pull to refresh

Comments 20

можно было хотя бы откомментировать, почему вам так не понравилось. Интересно же.
маленькое уточнение: то что вы написали — паттерн «фабрика». и осуществить его можно без знания что язык интерпретируемый, то есть применение function() внутри условий мне кажется сомнительным. хотя бы в контексте читабельности и реюзабельности
Фабрика чаще применяется для классов, а там она необязательно объявляет внутри себя — может и просто создавать.
Про читабельность согласен, но иногда важнее функциональность :)
фабрика — это способ создания. что она создает (классы, функции, делегаты) — не имеет значения. ваши функции можно точно также запихнуть в класс и тогда фабрика приобретет вид того, с чем вы были знакомы.
К сожелению вы изобретаете велосипед, даже не до конца изучив что же это за зверь такой, двухколесный и с педалями. Вы сейчас, своими силами, без ООП парадигмы пришли к такой чтуке как Factory, правда немножко своеобразной.

Не хочу сказать что это плохо, но если вы извлекли из этого какие-то знания — то скорее всего время потрачено не зря
Дело в том, что я знаю, что такое фактория :) Просто всю жизнь работаю с классами. А тут понадобилось работать именно с функциями, вот и придумал.
То, что Вы пишете в этой статье — зло в чистом виде.
Это существенно уменьшает читабельность и логичность кода, ведет к излишней путанице и сложности отладки.
на самом деле нет — дело привычки. И, опять же оговорюсь, эти конструкции редки и использовать их стоит лишь тогда, когда выгода от них может перекрыть все недостатки :)
Кстати, сегодня наткнулся на интересную возможность в пхп:

class Foo {
  private $id = 0;

  public function getId() {
    return $this->id;
  }
}

class Bar extends Foo {}

$bar = new Bar();
$bar->id = 10;
var_dump($bar->id);
var_dump($bar->getId());
var_dump($bar);

После запуска получим такие вот результаты:
int 10
int 0
object(Bar)[1]
private 'id' => int 0
public 'id' => int 10

Что она дает нам? Ответ прост — лишнуюю головную боль, потому как судя по этому куску кода $this, работает так же как и self::. Потому как если перенести getId в чайлд, то получим две десятки. Да и нахождение в объетке двух id — это слегка черезчур…
когда вы делаете $bar->id = 10; вы на лету создаете свойство public $id = 10; класса Bar, которое не имеет ничего общего с private $id = 0; класса Foo. Потому и getId выдает 10 десятки а вот ноль вы не получите из Bar никак. на то он и приватный. И два id в классе это нормально и ничему не противоречит.
getId() выдает мне 0, десятку я получаю когда пишу просто $bar->id.
я про ваш вариант с переносом getId в bar
Понятно. Просто немного непонят ваш коммент.

Просто очень странно, почему getId, находящийся в предке, используя this лезет именно в предка, а не в чайлда, который инстанцирован.
Потому что в PHP позднее связывание есть только 5.3.2. Знатоки поправят с номером версии, если я ошибаюсь.
Ам, понятно. Просто я по наивности своей считал, что вроде как в пыхе дела плохи только с поздним статическим связыванием, и никогда не натыкался на такие вот вещи, на которые мне пришлось наткнутся сегодня…

Все таки загадочный язык этот пых…
это вы просто такой загадочный программист, который приват переменные пытается долбить констуркциями вида $bar->id = 10;

специально для таких как вы созданы вот такие вот описания www.php.net/manual/en/language.oop5.visibility.php
Не сказал бы что загадочный, но все таки с немного другим типом мышления, подпорченным плюсами, где все это спокойно регулируется его виртуальными механизмами. Там же по сути с помощью них мы можем заставить работать все наше дерево классов, как бы в одной плоскости последнего чайлда, а можем и в этой самой иерархии.
ну тогда теряется «тот_самый_глубокий_смысл» слов protected и private. тут php больше похож на java. но (!), сдаётся мне, что «заставить работать все наше дерево классов, как бы в одной плоскости последнего чайлда» можно эмулировать средствами php (чего ими тока нельзя сделать...)
Не совсем теряется, просто у нас появляются еще один механизм для гибкости нашего дерева, простой пример:
class Foo {
  public:
    void getPrivateMethod() { this->privateMethod(); }
  private:
    virtual void privateMethod() { cout << «foo:: privatemethod»; }
};

class Bar: public Foo {
  private:
    void privateMethod() { cout << «bar:: privatemethod»; }
};

и написав:
Bar *bar = new Bar();
bar->getPrivateMethod();
мы получим bar:: privatemethod, потому как функция у нас виртуальная, сделав ее обычной то мы, как и в случае пхп и явы, которые работают абсолютно идентично, получили бы foo:: privatemethod.

Впринципе в жизни такое тоже можно использовать, хотя для этого отлично подходит и protected с abstract в других языках.

Вот… как-то так…
Sign up to leave a comment.

Articles