Pull to refresh

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';

Ну и как отследить?

Я имел ввиду конкретную ситуацию, которая приведена как пример в RFC.

Я не очень понимаю, что мешает сейчас сделать private свойство и для нее магический метод __get?
Ну тогда уж лучше просто геттер без сеттера
Мне кажется php слишком динамический для статичексокго анализа :)

class A {
  public $property;
}

$str = 'property';
(new A)->{$str} = 123;

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

Ссылки на видео о php конечно хорошо, но то что там все кроме одного говорят в микрофон вебкамеры, разобрать что-то крайне проблематично учитывая английский.
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
а если вот так?
$versionA = {($x) => $x + $y;
UFO just landed and posted this here
UFO just landed and posted this here

Да, прошлогодний вариант выглядел получше.

Видео-аудио — это хорошо, в качестве дополнения, но не заменит чтения материала (электронная или обычная книга).
Может еще как. У вас одностороннее мнение.
Кому-то проще услышать, чем прочитать. Я например могу читать один абзац и не понимать его, а если мне его прочтут то сразу понимаю.

Плюсую, существуют даже соответсвующие психотипы: визуал, аудиал, кинестетик, дискрет. Хотя в случае прочтения текста, подозревал что это вполне себе альтернатива "аудиалам", т.к. у каждого есть некий "внутренний голос", который читает вам написанный текст.


P.S. Ну, например, сейчас, читая, это, сообщение, ваш, внутренний, голос, неосознанно, запинается, на, каждом, слове. %)

Честно скажу, не запнулся, только когда прочитал подумал «о чем это он? аа вон запятые же»
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
Ну, если это не формат Хабра, то что же тогда формат? «Как кодить 72 часа в сутки и не умереть»?
UFO just landed and posted this here

По поводу 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 — это развитие вечного спора: «Getter/setter VS публичные свойства».
UFO just landed and posted this here

Это скорее попытка изобрести велосипед.


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

Мне нужны имутабельные структуры данных, и я не хочу для этого писать кучу кода из тупых геттеров сгенерированных IDE.

Sign up to leave a comment.