Вот в прошлом посте я осуждал сериализацию в пхп. Зачем я это делал? А вот я сейчас расскажу.
По науке если у класса есть некая переменная то она должна быть приватной, а обращаться к ней нужно через сеттер и геттер. Ну, чтобы там проверочьки, пыщ-пыщ, всё такое. А я вот такой волшебный человек и хочу заиспользовать магические методы __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