Comments 20
можно было хотя бы откомментировать, почему вам так не понравилось. Интересно же.
0
маленькое уточнение: то что вы написали — паттерн «фабрика». и осуществить его можно без знания что язык интерпретируемый, то есть применение function() внутри условий мне кажется сомнительным. хотя бы в контексте читабельности и реюзабельности
+1
Фабрика чаще применяется для классов, а там она необязательно объявляет внутри себя — может и просто создавать.
Про читабельность согласен, но иногда важнее функциональность :)
Про читабельность согласен, но иногда важнее функциональность :)
0
К сожелению вы изобретаете велосипед, даже не до конца изучив что же это за зверь такой, двухколесный и с педалями. Вы сейчас, своими силами, без ООП парадигмы пришли к такой чтуке как Factory, правда немножко своеобразной.
Не хочу сказать что это плохо, но если вы извлекли из этого какие-то знания — то скорее всего время потрачено не зря
Не хочу сказать что это плохо, но если вы извлекли из этого какие-то знания — то скорее всего время потрачено не зря
+4
То, что Вы пишете в этой статье — зло в чистом виде.
Это существенно уменьшает читабельность и логичность кода, ведет к излишней путанице и сложности отладки.
Это существенно уменьшает читабельность и логичность кода, ведет к излишней путанице и сложности отладки.
+3
Кстати, сегодня наткнулся на интересную возможность в пхп:
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 — это слегка черезчур…
-1
когда вы делаете $bar->id = 10; вы на лету создаете свойство public $id = 10; класса Bar, которое не имеет ничего общего с private $id = 0; класса Foo. Потому и getId выдает 10 десятки а вот ноль вы не получите из Bar никак. на то он и приватный. И два id в классе это нормально и ничему не противоречит.
+3
getId() выдает мне 0, десятку я получаю когда пишу просто $bar->id.
0
я про ваш вариант с переносом getId в bar
0
Понятно. Просто немного непонят ваш коммент.
Просто очень странно, почему getId, находящийся в предке, используя this лезет именно в предка, а не в чайлда, который инстанцирован.
Просто очень странно, почему getId, находящийся в предке, используя this лезет именно в предка, а не в чайлда, который инстанцирован.
0
Потому что в PHP позднее связывание есть только 5.3.2. Знатоки поправят с номером версии, если я ошибаюсь.
0
есть -> действует
0
Ам, понятно. Просто я по наивности своей считал, что вроде как в пыхе дела плохи только с поздним статическим связыванием, и никогда не натыкался на такие вот вещи, на которые мне пришлось наткнутся сегодня…
Все таки загадочный язык этот пых…
Все таки загадочный язык этот пых…
0
это вы просто такой загадочный программист, который приват переменные пытается долбить констуркциями вида $bar->id = 10;
специально для таких как вы созданы вот такие вот описания www.php.net/manual/en/language.oop5.visibility.php
специально для таких как вы созданы вот такие вот описания www.php.net/manual/en/language.oop5.visibility.php
0
Не сказал бы что загадочный, но все таки с немного другим типом мышления, подпорченным плюсами, где все это спокойно регулируется его виртуальными механизмами. Там же по сути с помощью них мы можем заставить работать все наше дерево классов, как бы в одной плоскости последнего чайлда, а можем и в этой самой иерархии.
0
ну тогда теряется «тот_самый_глубокий_смысл» слов protected и private. тут php больше похож на java. но (!), сдаётся мне, что «заставить работать все наше дерево классов, как бы в одной плоскости последнего чайлда» можно эмулировать средствами php (чего ими тока нельзя сделать...)
0
Не совсем теряется, просто у нас появляются еще один механизм для гибкости нашего дерева, простой пример:
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 в других языках.
Вот… как-то так…
0
Sign up to leave a comment.
Еще немного интересных возможностей.