Про пхп, область видимости и магические методы

Вот в прошлом посте я осуждал сериализацию в пхп. Зачем я это делал? А вот я сейчас расскажу.

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