Как стать автором
Обновить

Комментарии 11

Ничего себе RFC по необъявленным свойствам! What a time to be alive!

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

Либо же можно использовать класс-"помогайку" с флагом

#[AllowDynamicProperties] и тогда новые свойства "из ниоткуда" будет получать один класс, что, в теории, облегчит контроль и понимание кода (правда, сам этот класс тогда будет тяготеть или к мусорке, или к "god object")

Лично я — за. В легаси-коде можно будет сделать

class A extends \stdClass
{
}

и ничего не поломается, простое исправление.

Лучше все-таки с #[AllowDynamicProperties], потому что сработает даже если уже есть наследование.

#[AllowDynamicProperties]
class A extends B
{
}

Проблемы нет, экстендим B ))

Или через интерфейс

class A implements DymamicProperties

Уж лучше тогда трейт `use DynamicProperties` внутри которого будет магия `__get/__set`. Таким образом и в Легаси динамические свойства останутся, и будут при этом использовать более оптимизированный подход, чем старая имплементация

В качестве помогайки вполне можно и ассоциативный массив использовать. Если без динамических полей упростится и ускорится код интерпретатора - то грех их не выпилить. Можно даже без атрибута #[AllowDynamicProperties]. А кому уж очень нужны именно динамические поля - __get/__set в помощь.

@pronskiy - После установки PHP8.1-RC6 на локальном окружении столкнулся с проблемой, не сталкивались ли Вы?
Вот детали по окружению:

❯ php -v
PHP 8.1.0RC6 (cli) (built: Nov 11 2021 19:52:08) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.0RC6, Copyright (c), by Zend Technologies
❯ uname -a
Linux DESKTOP-I5PMM46 5.10.16.3-microsoft-standard-WSL2 #1 SMP Fri Apr 2 22:23:49 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
❯ dpkg-query -l | grep -i php8.1
ii  libapache2-mod-php8.1             8.1.0~rc6-1+ubuntu20.04.1+deb.sury.org+1                            amd64        server-side, HTML-embedded scripting language (Apache 2 module)
ii  php8.1                            8.1.0~rc6-1+ubuntu20.04.1+deb.sury.org+1                            all          server-side, HTML-embedded scripting language (metapackage)
ii  php8.1-cli                        8.1.0~rc6-1+ubuntu20.04.1+deb.sury.org+1                            amd64        command-line interpreter for the PHP scripting language
ii  php8.1-common                     8.1.0~rc6-1+ubuntu20.04.1+deb.sury.org+1                            amd64        documentation, examples and common module for PHP
ii  php8.1-opcache                    8.1.0~rc6-1+ubuntu20.04.1+deb.sury.org+1                            amd64        Zend OpCache module for PHP
ii  php8.1-readline                   8.1.0~rc6-1+ubuntu20.04.1+deb.sury.org+1                            amd64        readline module for PHP

В результате Composer начал ломаться во всех местах. Даже вызов -v вызывает краш:

❯ composer -v

Fatal error: Uncaught ErrorException: preg_match_all(): Compilation failed: unrecognised compile-time option bit(s) at offset 0 in phar:///usr/local/bin/composer/vendor/symfony/console/Formatter/OutputFormatter.php:137
Stack trace:
#0 [internal function]: Composer\Util\ErrorHandler::handle(2, 'preg_match_all(...', 'phar:///usr/loc...', 137)
#1 phar:///usr/local/bin/composer/vendor/symfony/console/Formatter/OutputFormatter.php(137): preg_match_all('#<(([a-z][a-z0-...', '', NULL, 256)
#2 phar:///usr/local/bin/composer/vendor/symfony/console/Output/Output.php(155): Symfony\Component\Console\Formatter\OutputFormatter->format('')
#3 phar:///usr/local/bin/composer/vendor/symfony/console/Output/Output.php(132): Symfony\Component\Console\Output\Output->write(Array, true, 16)
#4 phar:///usr/local/bin/composer/vendor/symfony/console/Application.php(641): Symfony\Component\Console\Output\Output->writeln('', 16)
#5 phar:///usr/local/bin/composer/vendor/symfony/console/Application.php(127): Symfony\Component\Console\Application->renderException(Object(ErrorException), Object(Symfony\Component\Console\Output\StreamOutput))
#6 phar:///usr/local/bin/composer/src/Composer/Console/Application.php(125): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#7 phar:///usr/local/bin/composer/bin/composer(67): Composer\Console\Application->run()
#8 /usr/local/bin/composer(24): require('phar:///usr/loc...')
#9 {main}
  thrown in phar:///usr/local/bin/composer/vendor/symfony/console/Formatter/OutputFormatter.php on line 137

При перестановке Composer под чистую валиться что-то вроде:

❯ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
❯ php composer-setup.php

Warning: preg_match(): Compilation failed: unrecognised compile-time option bit(s) at offset 0 in /home/khazhinov/composer-setup.php on line 461
All settings correct for using Composer
Downloading...

Warning: preg_replace(): Compilation failed: unrecognised compile-time option bit(s) at offset 0 in /home/khazhinov/composer-setup.php on line 1252

Warning: preg_replace(): Compilation failed: unrecognised compile-time option bit(s) at offset 0 in /home/khazhinov/composer-setup.php on line 1252

Warning: preg_replace(): Compilation failed: unrecognised compile-time option bit(s) at offset 0 in /home/khazhinov/composer-setup.php on line 1252

Warning: preg_replace(): Compilation failed: unrecognised compile-time option bit(s) at offset 0 in /home/khazhinov/composer-setup.php on line 1252

Warning: preg_replace(): Compilation failed: unrecognised compile-time option bit(s) at offset 0 in /home/khazhinov/composer-setup.php on line 1252

...

Нашел вчерашний Issue - https://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1830385.html

Ждём фиксов?

class FileStream { public resource $resource; } // Вызовет ошибку?

Надеюсь, они не забудут сделать все возможные типы перед этим.

Все ресурсы переделывают в объекты, поэтому тайпхинта resource не будет.
Подробнее можно почитать вот тут https://php.watch/articles/resource-object

Никита потроллил php team -)))

Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории