За последние 24 часа нас посетили 75260 программистов и 3063 робота. Сейчас ищут 1176 программистов ...

self или satic из трейта?

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

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

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

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    вот оно, супер, то есть смысл в частном применении, а не в общем навязывании я не спорю хорошего паттерна проектирования, но скорее всего для ядра: повесили нужные сервисы и пусть там и висят без них никак они всегда нужны +

    и кстати да - репозитории же :)
    --- Добавлено ---
    @mkramer
    PHP:
    1. <?php
    2.  
    3.  
    4. namespace core;
    5.  
    6.  
    7. use Error;
    8.  
    9. class Config
    10. {
    11.     private static $config = [];
    12.  
    13.     public static function get($name, $key = null)
    14.     {
    15.         if (!array_key_exists($name, self::$config)) {
    16.             self::set($name);
    17.         }
    18.         if ($key and !array_key_exists($key, self::$config[$name])) {
    19.             throw new Error("В массиве конфигурации {$name} параметр {$key} не найден");
    20.         }
    21.         return $key ? self::$config[$name][$key] : self::$config[$name];
    22.     }
    23.  
    24.     private static function set($name)
    25.     {
    26.         $config_file = "config/{$name}.php";
    27.         if (!is_file($config_file)) {
    28.             throw new Error("Конфигурационный файл {$config_file} не найден");
    29.         }
    30.         $array = require_once $config_file;
    31.         if (!is_array($array)) {
    32.             throw new Error("Конфигурационный файл {$config_file} не имеет массива данных");
    33.         }
    34.         self::$config[$name] = $array;
    35.     }
    36. }
    чем не контейнер от самоделкина :)

    с бодуна чего не наваяешь

    запрашивай по ключу чего нет добавит и вернёт и даже инклудить не будет каждый раз, будет брать с уже добавленного
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.825
    Симпатии:
    1.333
    Адрес:
    Лень
    Моя твоя не понимать. o_O Свяжи слова с каждой переменной.
    --- Добавлено ---
    ты не ответил на вопрос. Уже что-то другое подкидываешь. Реши сначала одну проблему. Почему у тебя переменная без массива ?
    --- Добавлено ---
    ....

    Ты зачем из контейнера превратил в недо-автозагрузчик классов, но он не загрузчик классов, а в конфиго-что-за ? а что.. стоп, мы про контейнер диалог вели емае o_Oo_O
    Это что за гидро-насос-био-статическая-бита для отпугивания инопланетян ?
    --- Добавлено ---
    с чего это вдруг set приватным методом стал ? :D
    а как собираешься контейнер наполнять ? не.. это.. а что это такое ? :D
    --- Добавлено ---
    Не путай
    Container !== Config

    :)
     
    #27 MouseZver, 8 дек 2020
    Последнее редактирование: 8 дек 2020
  3. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    @MouseZver, а ты get внимательно почитай
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.825
    Симпатии:
    1.333
    Адрес:
    Лень
    Все возможные конфиги сливаются в один массив https://www.php.net/manual/ru/function.array-merge-recursive.php
    после идут в класс config, далее
    PHP:
    1. <?php
    2.  
    3. [
    4.     'one' => [
    5.         'two' => [ 1,2,3 ],
    6.         'u' => [
    7.             'data' => true
    8.         ]
    9.     ]
    10. ]
    11.  
    12. /* ... */
    13.  
    14. $config = $container -> get( \Config :: class );
    15.  
    16. /*
    17.     [
    18.         1,
    19.         2,
    20.         3
    21.     ]
    22. */
    23. $config -> get( 'one.two' );
    24.  
    25. /*
    26.     true
    27. */
    28. $config -> get( 'one.u.data' );
    29.  
    30. /*
    31.     null
    32. */
    33. $config -> get( 'one.u.key' );
    34.  
    35. /*
    36.     set value for directory 'one.u.key' => 'text'
    37. */
    38. $config -> set( 'one.u.key', fn( &$v ) => $v = 'text' );
    39.  
    40. /*
    41.     string 'text'
    42. */
    43. $config -> get( 'one.u.key' );
    --- Добавлено ---
    Но мы про контейнер говорим. Причем тут конфиги ?
     
  5. Вероломство

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

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

    можно расширить класс: удалять массив после того как он получен либо получены все его элементы

    вот теперь немного становится понятно как должен работать контейнер, а не таскать за собой кучу готовых объектов из объекта в объект и думать: а чего это реген страницы полсекунды вместо одной тысячной и при онлайне в 10 человек сайт падать тупо стал)))

    возьми понасоздавай нужных функций, заинклудь их перед автолоадером и используй где угодно, зачем тебе обманывать себя словом - контейнер
     
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну чтоб до пол секунды довести, надо насовать объектов очень много в контейнер. Ну и есть методы этого избежать, Lazy-инициализация есть в php-di. Смысл контейнера в том, что все общие сервисы как раз таки один раз описаны. А потом, при использовании автовайринга особенно
    PHP:
    1. class A {
    2.     // Новая крутая фишка php 8 - одновременное объявление и инициализация свойства в конструкторе
    3.     public function __construct(private DependencyClass $dependency) {}
    4.    
    5.    public function someMethod() {
    6.        $this->dependence->someMethodOfDependency();
    7.    }
    8. }
    9.  
    10. $a = $container->make(A::class); // Если зависимость настроена, она подставляется сама собой
    А если ещё нормальный роутер реализован/использован, то про контейнер зависимости знает только он, не надо держать глобальную переменную $container держать, он сам перед вызовом контроллера все зависимости разрешит.
     
  7. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    @mkramer, я с php-di знакомился вот по этому видео
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну ОК. Я видео не смотрю, когда есть что почитать
     
  9. Вероломство

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

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    если есть лишнее время
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.825
    Симпатии:
    1.333
    Адрес:
    Лень
    в смысле по требованию ? Это конфиги и их изначально заливают в проект.
    Это тебе не spl_autoload_register

    В них ничего не работает, а если например с БД загрузить соединение - то делаешь это с помощью ЗАМЫКАНИЙ.
    И по требованию эти замыкания ОДИН раз дергаются (см. как реализация еще создана).
    Это хоть понятно ?

    Нафига ? Это тебе не resource GD и т. д.

    PHP служит чтобы умереть - это ничего не говорит ? В ботах да, лишнее удалять, РАЗУМНО удалять, но конфиги чистить... кхм.. жизнь сложилась не так ?

    Зачем удалять ?

    Ровно через 2 года, если ты не кинешь изучать PHP, вернись в копию этих слов. Стыдно ? я знаю, еще как будет.

    А если множество аргументов ?
    Описание над каждым свойством ?

    уже одна фишка прогорела:

    PHP:
    1. public
    2.     array $a,
    3.     int $b,  // syntax error
    4.     $c;
    --- Добавлено ---
    Но я хочу php 8
    --- Добавлено ---
    хочу как в с++
    PHP:
    1. <?php
    2.  
    3. struct fff
    4. {
    5.     private Class_name1;
    6.     public int $a = 0;
    7. }
    8.  
    9. class test
    10. {
    11.     public function __construct( fff ...$set ) {}
    12. }
    --- Добавлено ---
    почему до сих пор не загнали фишку с контролем множественных типов
    PHP:
    1. public function name( int | array $value ): int | array
    2. {
    3.     ...
    4.  
    5.     return $value;
    6. }
    ибо существует лишь ?array
    null or (others type)
     
    #35 MouseZver, 9 дек 2020
    Последнее редактирование: 9 дек 2020
  11. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Да запросто. Но что-то я от тебя не ожидал, что ты php 8 пропустишь :) Ты же всегда рисуешь на самом новом пыхе код несчастным новичкам, которые все как один ставят денвер с 5.3 :D:D. PHP 8 уже вышел. И этот момент даже в доке уже нормально освещён, в отличие от атрибутов. https://www.php.net/manual/en/language.oop5.decon.php#language.oop5.decon.constructor.promotion

    Ну описание PHP Doc ты имеешь в виду? Это уже не язык, ты же понимаешь. Для интерпретатора это просто комментарии. Можно и в объявление конструктора замутить их.
    --- Добавлено ---
    О, написал - и заметил, что уже и по атрибутам дописали доку.
    --- Добавлено ---
    Загнали, ты чтой-то пропустил. https://www.php.net/manual/en/language.types.declarations.php#language.types.declarations.union
     
    MouseZver нравится это.
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.825
    Симпатии:
    1.333
    Адрес:
    Лень
    Прое..л. Почитаю.
     
    #37 MouseZver, 9 дек 2020
    Последнее редактирование: 9 дек 2020