Вот в прошлом посте я осуждал сериализацию в пхп. Зачем я это делал? А вот я сейчас расскажу.
По науке если у класса есть некая переменная то она должна быть приватной, а обращаться к ней нужно через сеттер и геттер. Ну, чтобы там проверочьки, пыщ-пыщ, всё такое. А я вот такой волшебный человек и хочу заиспользовать магические методы __set() и __get() для этого:
class FRIENDSHIP_IS_MAGIC { public $PinkiePie; private $Applejack; public function __set ( $key, $value ) { if ( strlen($value) == 0 ) { return 42; } $this->$key = $value; } public function __get ( $key ) { return $this->$key; } } $pony = new FRIENDSHIP_IS_MAGIC(); var_dump($pony->Applejack = ''); // string(0) "" var_dump($pony->Applejack); // NULL var_dump($pony->Applejack = '<3'); // string(2) "<3" var_dump($pony->Applejack); // string(2) var_dump($pony->PinkiePie); // NULL var_dump($pony->PinkiePie = ''); // string(0) "" var_dump($pony->PinkiePie); // string(0) ""
Нет, ну это, конечно, очевидно что не каждый будет любить Applejack, а Pinky Pie личность сомнительного карактера. Но несмотря на то что в документации написано “__set() is run when writing data to inaccessible properties.” меня это раздражает. Какого чёрта. Не нравится мне такая логика.
Так вот почему я осуждал: чтобы сеттер срабатывал мне надо было сделать область видимости отличной от публичной и вполне логично было бы сделать её приватной, но не всё так просто %).
PS: я тут перечитал и ничего не понял. Смысл поста в том что если переменная публичная, то сеттер не сработает.
2013.01.28 21:26