В ноябре мы выпустим версию 8.4 нашего любимого PHP, а вместе с ней у нас появится новая функция, долгожданная сообществом: перехватчики свойств! Эта новая функция, вдохновленная другими языками, такими как C#, Swift и Kotlin, избавляет от хлопот, связанных с магическими методами __set() и __get().
Я собираюсь показать пример того, как в настоящее время иметь геттеры и сеттеры без необходимости создавать свойство как частное и создавать два новых метода с именами, отличными от имени свойства.
class Foo { private String $bar; public function __set($name, $value) { $this->$name = $value . "!!!"; } public function __get($name) { return "!!!" . $this->$name; } }
Используя __get() и __set(), я могу оставить $bar общедоступным, когда устанавливаю значение и когда ищу значение, но с другой реализацией и без необходимости создавать методы с именами, отличными от свойства. В наглядном примере использование будет выглядеть так:
$foo = new Foo(); $foo->bar = "new release"; // aqui o valor que ficará salvo seria "new release!!!" echo $foo->bar; // aqui retornaria "!!!new release!!!"
Теперь представьте, как будут выглядеть __get() и __set() с другими свойствами — полный беспорядок. Другой способ сделать это — создать метод getBar() и еще один метод setBar(), но при этом учитывается только одно свойство, и его использование будет отличаться от предыдущего:
class Foo { private String $bar; public function setBar($value) { $this->bar = $value . "!!!"; } public function getBar() { return "!!!" . $this->bar; } } $foo = new Foo(); $foo->setBar('new release'); // aqui o valor que ficará salvo seria "new release!!!" echo $foo->getBar(); // aqui retornaria "!!!new release!!!"
Лично меня немного раздражает создание новых методов для этого варианта использования, я предпочитаю использовать прямой вызов свойства как для получения, так и для установки его значения. Эта новая функция призвана разрешить этот беспорядок и позволить вам определять методы get и set индивидуально вместе с объявлением в классе.
class Foo { public String $bar { set (String $value) => $this->bar = $value . "!!!"; get => "!!! . $this->bar"; } }
Этот новый код делает то же самое, но индивидуально, без создания новых методов или использования __get() и __set(), которые требуют обработки каждого свойства класса.
Теперь просто дождитесь запуска этой новой функции, которая должна появиться 21 ноября!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3