PHP: class App { public function __construct(private ContainerInterface $container = null) { $this->container = $container ?? new Container(); // так можно? } } Дело в том что автокомплит шторма не понимает $container, он его раскрывает как $this->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. Поправил пример чтобы был короче и нагляднее
А как тебе такая фишка 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: $im = ScreenUILibreAlchemy :: OnAlchemyReactionFinished(); $this -> imSim -> build( im: $im, separate: [ [ 0, 0 ] ], width: imagesx ( $im ), height: imagesy ( $im ), iterator: interatorToBlackWhitePixels :: class, movement: $this -> imSim -> movementNot() ); --- Добавлено --- или 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: public function __construct ( private ImageSimilarity $imSim, private array $potionsList, private array $aspects, private int $countReaction, private bool $sorting, private string $modsPath ) { ... }