Мы с другом уже некоторое время спорим по скайпу, когда полезны такие магические методы, как __get.
Например, скажем, у вас есть публичный / приватный массив:
class test {
private $array = ['test' => 'blah'];
public function __get($name) {
return $this->array[$name];
}
}
это правильное применение магических методов? Мы спорим, потому что на странице php.net для магических методов написано «недоступные элементы / свойства». Я верю, что это означает private
переменные, и хотя он может быть использован для массива вещей внутри массивов без явного доступа к массиву, это не предполагаемое использование.
Вам нужно использовать магию, только если объект действительно «магический». Если у вас есть классический объект с фиксированными свойствами, используйте сеттеры и геттеры, они работают нормально.
Если ваш объект имеет динамические свойства, например, он является частью уровня абстракции базы данных, а его параметры устанавливаются во время выполнения, тогда вам действительно нужны магические методы для удобства.
Посмотрите этот пример с методами магии __set
а также __get
:
<?php
class PropertyTest
{
private $a, $b;
public function __set($name, $value)
{
echo "Set '$name' to '$value'\n";
$this->$name = $value;
}
public function __get($name)
{
echo "Get $name \n";
return $this->$name;
}
}
echo "<pre>\n";
$obj = new PropertyTest;
$obj->a = 1;
echo $obj->a . "\n\n";
echo "<pre>\n";
$obj = new PropertyTest;
$obj->b = "Hello";
echo $obj->b . "\n\n";
?>
Вы можете прочитать больше на:
Редактировать с другим примером, используя магический метод __call
:
<?php
class Called {
private $Id, $Name;
public function __call($name, $arguments) {
$action = substr($name, 0, 3);
$field = substr($name, 3);
if($action == 'set') {
$this->$field = $arguments[0];
}
if($action == 'get') {
return $this->$field;
}
}
}
$obj = new Called();
$obj->setId(4);
echo "<br/>\n";
echo $obj->getId();
echo "<br/>\n";
$obj->setName('Peter');
echo "<br/>\n";
echo $obj->getName();
?>
Вы можете прочитать больше на:
Ссылка:
Других решений пока нет …