класс — Когда использовать магические методы в PHP?

Мы с другом уже некоторое время спорим по скайпу, когда полезны такие магические методы, как __get.

Например, скажем, у вас есть публичный / приватный массив:

class test {
private $array = ['test' => 'blah'];

public function __get($name) {
return $this->array[$name];
}
}

это правильное применение магических методов? Мы спорим, потому что на странице php.net для магических методов написано «недоступные элементы / свойства». Я верю, что это означает private переменные, и хотя он может быть использован для массива вещей внутри массивов без явного доступа к массиву, это не предполагаемое использование.

2

Решение

Вам нужно использовать магию, только если объект действительно «магический». Если у вас есть классический объект с фиксированными свойствами, используйте сеттеры и геттеры, они работают нормально.

Если ваш объект имеет динамические свойства, например, он является частью уровня абстракции базы данных, а его параметры устанавливаются во время выполнения, тогда вам действительно нужны магические методы для удобства.

Посмотрите этот пример с методами магии __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();

?>

Вы можете прочитать больше на:

Ссылка:

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]