Методы PHP __get __set
class Dog {
protected $bark = 'woof!';
public function __get($key) {
if (isset($this->$key)) {
return $this->$key;
}
}
public function __set($key, $val) {
if (isset($this->$key)) {
$this->$key = $val;
}
}
}
Какой смысл использовать эти функции.
если я могу использовать
$dog = new Dog();
$dog->bark = 'woofy';
echo $dog->bark;
Зачем мне объявлять "кора" как protected
? Сделать __get()
а также __set()
методы в этом случае эффективно сделать публичным "лаять"?
3 ответа
В этом случае они делают $this->bark
эффективно публично, поскольку они просто устанавливают и извлекают значение. Однако, используя метод getter, вы можете выполнять больше работы во время его установки, например проверять его содержимое или изменять другие внутренние свойства класса.
Не обязательно использовать со свойствами объекта.
Вот что делает их сильными.
пример
class View extends Framework {
public function __get($key) {
if (array_key_exists($key, $this->registry)) {
return trim($this->registry[$key]);
}
}
}
По сути, я пытаюсь продемонстрировать, что они не должны использоваться просто как методы получения и установки свойств объекта.
Вы обычно никогда не оставляете те __get
а также __set
именно так, как вы оставили его.
Есть много способов, которыми эти методы могут быть полезны. Вот пара примеров того, что вы могли бы сделать с этими методами.
Вы можете сделать свойства только для чтения:
protected $bark = 'woof!';
protected $foo = 'bar';
public function __get($key) {
if (isset($this->$key)) {
return $this->$key;
}
}
public function __set($key, $val) {
if ($key=="foo") {
$this->$key = $val; //bark cannot be changed from outside the class
}
}
Вы можете работать с данными, которые у вас есть, перед тем, как получать или настраивать данные:
// ...
public $timestamp;
public function __set($var, $val)
{
if($var == "date")
{
$this->timestamp = strtotime($val);
}
}
public function __get($var)
{
if($var == date)
{
return date("jS F Y", $this->timestamp);
}
}
Еще один простой пример того, что вы можете сделать с __set
может быть, чтобы обновить строку в базе данных. Таким образом, вы изменяете что-то, что не обязательно находится внутри класса, но вы используете класс, чтобы упростить, как это изменяется / принимается.