Comments 39
$email->email = "bar@php.net" // Вызов повлечет Fatal Error
Мне кажется, для immutable классов такой вызов можно отследить еще на этапе парсинга скрипта до реального исполнения. Это ведь присваивание свойству класса, который объявлен неизменяемым.
class MyClass1
{
public $email;
}
immutable class MyClass2
{
public $email;
}
$class = new ('MyClass' . random_int(1, 2));
$class->email = 'some@any.com';
Ну и как отследить?
class A {
public $property;
}
$str = 'property';
(new A)->{$str} = 123;
Кому-то проще услышать, чем прочитать. Я например могу читать один абзац и не понимать его, а если мне его прочтут то сразу понимаю.
Плюсую, существуют даже соответсвующие психотипы: визуал, аудиал, кинестетик, дискрет. Хотя в случае прочтения текста, подозревал что это вполне себе альтернатива "аудиалам", т.к. у каждого есть некий "внутренний голос", который читает вам написанный текст.
P.S. Ну, например, сейчас, читая, это, сообщение, ваш, внутренний, голос, неосознанно, запинается, на, каждом, слове. %)
По поводу immutable
. Как было сказано в комментарии выше, это достигается объявлением приватных свойств, которые инициализируются только через конструктор и читаются через геттеры.
Если с помощью immutable
можно было бы запретить такое, и это было бы нормально по производительности, то смысл в immutable
был бы на мой взгляд:
class Person {
public $id;
public function __construct ($id) {
$this->id = $id;
}
}
immutable class Transaction {
public $amount;
public $fromPerson;
public $toPerson;
public function __construct ($amount, Person $from, Person $to) {
$this->amount = $amount;
$this->fromPerson = $from;
$this->toPerson = $to;
}
}
$person1 = new Person(1);
$person2 = new Person(2);
$transaction = new Transaction(100, $person1, $person2);
$person1->id = 10; // Вот если бы тут выдавать Fatal Error...
А если этого не запрещать, то остается ловушка, в которую не так уж и сложно попасть.
Это скорее попытка изобрести велосипед.
immutable class A
{
public $b;
}
class A
{
public final $b;
}
С final
можно определять только методы и классы. Ваш пример выдаст
PHP Fatal error: Cannot declare property A::$b final, the final modifier is allowed only for methods and classes in php shell code on line 3
А пример c immutable выдаст:
PHP Parse error: syntax error, unexpected 'class' (T_CLASS) in… on line 2
Спасибо, капитан! :D
Предлагаю чуток оглянуться вокруг и вспомнить, что мир не ограничен одним PHP: Что есть final для полей ;)
Мне нужны имутабельные структуры данных, и я не хочу для этого писать кучу кода из тупых геттеров сгенерированных IDE.
PHP-Дайджест № 90 – интересные новости, материалы и инструменты (1 – 14 августа 2016)