При записи данных в недоступные свойства вызывается «магический метод» __set
(если он объявлен).
Вы можете использовать это в своих интересах, чтобы предотвратить создание необъявленных свойств:
<?php
class Foo
{
public $bar;
private $baz;
public function __set($name, $value)
{
throw new Exception('Strictly no writes to inaccesible and undeclared properties.');
}
}
$f = new Foo;
$f->bar = 'hello';
$f->qux = 'earth';
Вывод:
Fatal error: Uncaught Exception: Strictly no writes to inaccesible and undeclared properties. in /var/www/stackoverflow/so-tmp-f2.php:20 Stack trace: #0 /var/www/stackoverflow/so-tmp-f2.php(26): Foo->__set('qux', 'earth') #`1 {main} thrown in /var/www/stackoverflow/so-tmp-f2.php on line 20
Как видите, вышеприведенное вызовет исключение при попытке записи в необъявленное свойство.
Если вы попытаетесь записать в другое недоступное свойство(в аналогичной области), как и Foo::baz
выше (который объявлен закрытым), вызовы также будут маршрутизироваться с помощью магического метода __set.Без метода __set это приведет к фатальной ошибке.
Однако запись в Foo::bar
(объявленная как общедоступная выше) НЕ будет направлена через магический метод __set.
Если вы хотитедля обеспечения такого строгого поведения во многих классах вы могли бы реализовать вышеупомянутое как черту:
trait Upsetter
{
public function __set($name, $value)
{
throw new Exception('Strictly no writes to inaccesible and undeclared properties.');
}
}
class Bob
{
use Upsetter;
}