типизированные свойства

grigori

( ͡° ͜ʖ ͡°)
Команда форума
сабж недокументированный, и веселый

PHP:
class A{
    public string $x;
}
$A = new A;
var_dump(isset($A->x)); // bool(false) - ожидаемо
var_dump((array)$A); ////array(0) {}
var_dump(get_object_vars($A)); //array(0) {}
var_dump($A); //class A#1 (1) {} - принес посылку! только я вам ее не отдам
var_dump(property_exists($A,'x'));//true
свойство шреддингера - оно и есть, и его нет одновременно :)

ломает валидаторы, магию и соглашения, которые под капотом работают со свойствами в объектах
 
Последнее редактирование:

AmdY

Пью пиво
Команда форума
Подсказывают, что ты не прав
PHP:
Interactive shell

php > class A{
php {     public string $x;
php { }
php > $A = new A;
php > var_dump(isset($A->x)); // bool(false) -
bool(false)
php > var_dump((array)$A); ////array(0) {}
array(0) {
}
php > var_dump(get_object_vars($A)); //array(0) {}
array(0) {
}
php > var_dump($A); //class A#1 (1) {} -  !
object(A)#1 (0) {
  ["x"]=>
  uninitialized(string)
}
php > var_dump(property_exists($A,'x'));//true
bool(true)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
да, это проблема Xdebug
PS C:\> php -r 'var_dump(new class{public string $x;});'
Command line code:1:
object(class@anonymous)#1 (0) {
["x"]=>
uninitialized(string)
}
PS C:\> php -r 'var_dump(new class{public string $x;});' -d "zend_extension=xdebug"
Command line code:1:
class class@anonymous#1 (1) {
}
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
А еще такой прикол :)
PHP:
abstract class Base{
    public function __get($name){}
}
class A extends Base{
    public string $x;
}
(new A)->x;
//Fatal error: Uncaught TypeError: Typed property A::$x must be string, null used
PHP:
(new class {
    public function __get($name){echo 'magic';}
    public ?string $x;
})->x; // magic
(new class {
    public function __get($name){echo 'magic';}
    public $x;
})->x; // __get() не вызывается
кто из фреймвоков у нас любит магию для виртуальных свойств в базовых классах? все?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
По сути, в стандартах низкоуровневой архитектуры нужно правило, что для типизированных свойств надо обязательно писать инициализацию при объявлении, иначе будет непредсказуемая хрень. Здравствуй, паскаль, лет 30 как не вспоминал о проблемах без инициализации при декларации.
 

AmdY

Пью пиво
Команда форума
вся эта типизация жуть жуткая, выкатывается кусками, работает странно и самое главное - код становится писать более геморно, чем в других языках, где всё это было сделано гораздо раньше и более продуманно.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
может быть, Никита исправит ... вот это поворот! я был уверен, что меня пошлют и отложат вопрос на 5 лет, как это было раньше
проголосуйте, plz, если вам это интересно, проблема в перспективе важная
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
я сижу обалдевший, в PHP обратили внимание на ошибку консистентности логики - такое вообще бывает?
Никита запросил обоснование, не послал меня, и даже закоммитил патч, это какая-то новая реальность
 

AnrDaemon

Продвинутый новичок
Так бывает. Заметная часть RFC выросла из таких ошибок.
 
Сверху