Комментарии 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 -)))
PHP Дайджест № 215 (1 – 15 ноября 2021)