За последние 24 часа нас посетили 36938 программистов и 7904 робота. Сейчас ищут 1754 программиста ...

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

Тема в разделе "PHP для новичков", создана пользователем Вероломство, 17 авг 2023.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    PHP:
    1. class App {
    2.     public function __construct(private ContainerInterface $container = null)
    3.     {
    4.         $this->container = $container ?? new Container(); // так можно?
    5.     }
    6. }
    Дело в том что автокомплит шторма не понимает $container, он его раскрывает как $this->container.
     
  2. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    переезжаем с 7.2 на 8.2 :)
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    А пыха понимает? Но тогда уже лучше, наверное
    PHP:
    1. $this->container ??= new Container();
     
    Вероломство нравится это.
  4. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    вроде понимает, ошибок не выдаёт и вроде как всё работает по логике

    сделаю ??=

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

    спс
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    PHP:
    1. public function __construct( private ContainerInterface $container = new Container() )
    Для вас динозавры
     
    Вероломство нравится это.
  6. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    @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. ?>
     
  7. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147
    @Вероломство, если выяснится, что недоработка на стороне Шторма, репортни им баг, они очень шустро правки вносят.
     
    Вероломство нравится это.
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

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

    Вероломство Активный пользователь

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

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

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

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.223
    Адрес:
    там-сям
    Ты можешь писать $container. В данном случае это будет свойство объекта.

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

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    @artoodetoo свойство объекта, как входящий параметр?

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

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.223
    Адрес:
    там-сям
    Я в 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. Поправил пример чтобы был короче и нагляднее
     
    Вероломство нравится это.
  13. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    @artoodetoo принято :) ну такое же и зверомышь показал
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.223
    Адрес:
    там-сям
    А как тебе такая фишка 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. >
    Вообще снос башки!
     
    Вероломство нравится это.
  15. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    но больше использую 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.     }
     
    artoodetoo нравится это.