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 — это слегка черезчур…
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 лезет именно в предка, а не в чайлда, который инстанцирован.
Просто очень странно, почему getId, находящийся в предке, используя this лезет именно в предка, а не в чайлда, который инстанцирован.
Потому что в PHP позднее связывание есть только 5.3.2. Знатоки поправят с номером версии, если я ошибаюсь.
есть -> действует
Ам, понятно. Просто я по наивности своей считал, что вроде как в пыхе дела плохи только с поздним статическим связыванием, и никогда не натыкался на такие вот вещи, на которые мне пришлось наткнутся сегодня…
Все таки загадочный язык этот пых…
Все таки загадочный язык этот пых…
это вы просто такой загадочный программист, который приват переменные пытается долбить констуркциями вида $bar->id = 10;
специально для таких как вы созданы вот такие вот описания www.php.net/manual/en/language.oop5.visibility.php
специально для таких как вы созданы вот такие вот описания 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 в других языках.
Вот… как-то так…
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.
Еще немного интересных возможностей.