Поясните, не нашёл в доках

PHP:
  1. class App {
  2.     public function __construct(private ContainerInterface $container = null)
  3.     {
  4.         $this->container = $container ?? new Container(); // так можно?
  5.     }
  6. }

Дело в том что автокомплит шторма не понимает $container, он его раскрывает как $this->container.

 

переезжаем с 7.2 на 8.2 :)

 

А пыха понимает? Но тогда уже лучше, наверное

PHP:
  1. $this->container ??= new Container();
 

вроде понимает, ошибок не выдаёт и вроде как всё работает по логике

сделаю ??=

нужно привыкать к синтаксису, раз уж на 8.2 перелажу

спс

 

PHP:
  1. public function __construct( private ContainerInterface $container = new Container() )

Для вас динозавры

 

@MouseZver спс :)

я видел такой варик в доках, но там при динамике нужно аннотацию писать ЧТО ЛИ, короче я не понял ПОЛНОСТЬЮ

Пример #4 Пример использования new в инициализации класса

PHP:
  1. <?php
  2. // Всё допустимо:
  3. static $x = new Foo;
  4. const C = new Foo;
  5.  
  6. function test($param = new Foo) {}
  7.  
  8. #[AnAttribute(new Foo)]
  9. class Test {
  10.     public function __construct(
  11.         public $prop = new Foo,
  12.     ) {}
  13. }
  14. // Всё не допустимо (ошибка во времени компиляции):
  15. function test(
  16.     $a = new (CLASS_NAME_CONSTANT)(), // динамическое имя класса
  17.     $b = new class {}, // анонимный класс
  18.     $c = new A([]), // распаковка аргументов
  19.     $d = new B($abc), // неподдерживаемое постоянное выражение
  20. ) {}
  21. ?>
 

@Вероломство, если выяснится, что недоработка на стороне Шторма, репортни им баг, они очень шустро правки вносят.

 

Так ведь это и есть свойство, а не только аргумент! Ты использовал специальный новый синтаксис объявление свойств в сигнатуре конструктора. Внутри такого конструктора (и только в нём) ты можешь писать $container имея в виду $this->container.
Так что автокомплит шторма прав, а ты нет ;)
ццц. ошибочка вышла — внутри сигнатуры только можно, а в теле твоего конструктора идентификатор $container это Undefined variable.

 

@artoodetoo ты противоречишь сам себе: — Внутри такого конструктора (и только в нём) ты можешь писать $container имея в виду $this->container. Так что автокомплит шторма прав, а ты нет.

так могу писать $container или нет? :)

автокомплит же $this->container разворачивает и шторм прав :)

 

Ты можешь писать $container. В данном случае это будет свойство объекта.

НЕТ. не будет. это бл*ть Undefined variable. тот случай, когда сам себя заморочал. если ты используешь краткое объявление свойств, оставляй тело конструктора пустым, иначе будет сложно читаться и пониматься. Аминь!

 

@artoodetoo свойство объекта, как входящий параметр?

просто я пока к синтаксису новому не привык, мне понятнее — this->container, как свойство и $container, как параметр

 

Я в Laravel tinker сделал пример с объявлением свойства по-новому, со значением по умолчанию, как ты любишь.

PHP:
  1. > class A { function __construct() { echo «A CONSTRUCTOR EXECUTED\n«; } }
  2. > class B { function __construct(public $f = new A) { } }
  3. > $b1 = new B
  4. A CONSTRUCTOR EXECUTED
  5. = B {#7952
  6.  +f: A {#7950},
  7.  }
  8.  
  9. > $b2 = new B(‘magic’)
  10. = B {#7946
  11.  +f: «magic»,
  12.   }
  13.  
  14. >

Кажется он объясняет всё. Свойство объявляется. Ему можно сразу присвоить значение. Тело конструктора можно (скорее нужно) оставить пустым.

P.S. Поправил пример чтобы был короче и нагляднее

 

@artoodetoo принято :) ну такое же и зверомышь показал

 

А как тебе такая фишка PHP8 как именованные параметры?

PHP:
  1. > class D { \
  2.   public function __construct(public object $fieldA = new A, public object $fieldB = new B) \
  3.   { \
  4.   } \
  5. }
  6. > new D( fieldB: (object)[‘zxc’ => ‘qwe’] )
  7. A CONSTRUCTOR EXECUTED
  8. = D {#7982
  9.  +fieldA: A {#7963},
  10.  +fieldB: {#7979
  11.  +«zxc»: «qwe»,
  12.   },
  13.   }
  14.  
  15.  
  16. >

Вообще снос башки!

 

но больше использую name params для красоты и как более типизированный тип кода.

Например

PHP:
  1.         $im = ScreenUILibreAlchemy :: OnAlchemyReactionFinished();
  2.      
  3.         $this -> imSim -> build(
  4.             im: $im,
  5.             separate: [ [ 0, 0 ] ],
  6.             width: imagesx ( $im ),
  7.             height: imagesy ( $im ),
  8.             iterator: interatorToBlackWhitePixels :: class,
  9.             movement: $this -> imSim -> movementNot()
  10.         );

— Добавлено —
или

PHP:
  1.             $libreAlchemy = new LibreAlchemy(
  2.                 imSim: new \App\…,
  3.                 potionsList: $potionsList,
  4.                 aspects: array_values ( array_intersect_key ( ( array ) end ( $potionsList ), array_flip( [ ‘a1’, ‘a2’, ‘a3’, ‘a4’, ‘a5’ ] ) ) ),
  5.                 countReaction: ( int ) $countReaction,
  6.                 sorting: $sorting,
  7.                 modsPath: config( ‘ююю’ )
  8.             );

— Добавлено —

PHP:
  1.     public function __construct
  2.     (
  3.         private ImageSimilarity $imSim,
  4.         private array $potionsList,
  5.         private array $aspects,
  6.         private int $countReaction,
  7.         private bool $sorting,
  8.         private string $modsPath
  9.     )
  10.     {
  11.        
  12.     }
 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *