PHP:
class App { public function __construct(private ContainerInterface $container = null) { $this->container = $container ?? new Container(); // так можно? } }Дело в том что автокомплит шторма не понимает $container, он его раскрывает как $this->container.
переезжаем с 7.2 на 8.2
А пыха понимает? Но тогда уже лучше, наверное
PHP:
$this->container ??= new Container();
вроде понимает, ошибок не выдаёт и вроде как всё работает по логике
сделаю ??=
нужно привыкать к синтаксису, раз уж на 8.2 перелажу
спс
PHP:
public function __construct( private ContainerInterface $container = new Container() )Для вас динозавры
@MouseZver спс
я видел такой варик в доках, но там при динамике нужно аннотацию писать ЧТО ЛИ, короче я не понял ПОЛНОСТЬЮ
Пример #4 Пример использования new в инициализации класса
PHP:
<?php // Всё допустимо: static $x = new Foo; const C = new Foo; function test($param = new Foo) {} #[AnAttribute(new Foo)] class Test { public function __construct( public $prop = new Foo, ) {} } // Всё не допустимо (ошибка во времени компиляции): function test( $a = new (CLASS_NAME_CONSTANT)(), // динамическое имя класса $b = new class {}, // анонимный класс $c = new A(…[]), // распаковка аргументов $d = new B($abc), // неподдерживаемое постоянное выражение ) {} ?>
@Вероломство, если выяснится, что недоработка на стороне Шторма, репортни им баг, они очень шустро правки вносят.
Так ведь это и есть свойство, а не только аргумент! Ты использовал специальный новый синтаксис объявление свойств в сигнатуре конструктора. Внутри такого конструктора (и только в нём) ты можешь писать $container имея в виду $this->container.
Так что автокомплит шторма прав, а ты нет ццц. ошибочка вышла — внутри сигнатуры только можно, а в теле твоего конструктора идентификатор $container это Undefined variable.
@artoodetoo ты противоречишь сам себе: — Внутри такого конструктора (и только в нём) ты можешь писать $container имея в виду $this->container. Так что автокомплит шторма прав, а ты нет.
так могу писать $container или нет?
автокомплит же $this->container разворачивает и шторм прав
Ты можешь писать $container. В данном случае это будет свойство объекта.
НЕТ. не будет. это бл*ть Undefined variable. тот случай, когда сам себя заморочал. если ты используешь краткое объявление свойств, оставляй тело конструктора пустым, иначе будет сложно читаться и пониматься. Аминь!
@artoodetoo свойство объекта, как входящий параметр?
просто я пока к синтаксису новому не привык, мне понятнее — this->container, как свойство и $container, как параметр
Я в Laravel tinker сделал пример с объявлением свойства по-новому, со значением по умолчанию, как ты любишь.
PHP:
> class A { function __construct() { echo «A CONSTRUCTOR EXECUTED\n«; } } > class B { function __construct(public $f = new A) { } } > $b1 = new B A CONSTRUCTOR EXECUTED = B {#7952 +f: A {#7950}, } > $b2 = new B(‘magic’) = B {#7946 +f: «magic», } >Кажется он объясняет всё. Свойство объявляется. Ему можно сразу присвоить значение. Тело конструктора можно (скорее нужно) оставить пустым.
P.S. Поправил пример чтобы был короче и нагляднее
@artoodetoo принято ну такое же и зверомышь показал
А как тебе такая фишка PHP8 как именованные параметры?
PHP:
> class D { \ public function __construct(public object $fieldA = new A, public object $fieldB = new B) \ { \ } \ } > new D( fieldB: (object)[‘zxc’ => ‘qwe’] ) A CONSTRUCTOR EXECUTED = D {#7982 +fieldA: A {#7963}, +fieldB: {#7979 +«zxc»: «qwe», }, } >Вообще снос башки!
но больше использую name params для красоты и как более типизированный тип кода.
Например
PHP:— Добавлено —
илиPHP:
$libreAlchemy = new LibreAlchemy( imSim: new \App\…, potionsList: $potionsList, aspects: array_values ( array_intersect_key ( ( array ) end ( $potionsList ), array_flip( [ ‘a1’, ‘a2’, ‘a3’, ‘a4’, ‘a5’ ] ) ) ), countReaction: ( int ) $countReaction, sorting: $sorting, modsPath: config( ‘ююю’ ) );— Добавлено —
PHP: