вот оно, супер, то есть смысл в частном применении, а не в общем навязывании я не спорю хорошего паттерна проектирования, но скорее всего для ядра: повесили нужные сервисы и пусть там и висят без них никак они всегда нужны + и кстати да - репозитории же --- Добавлено --- @mkramer PHP: <?php namespace core; use Error; class Config { private static $config = []; public static function get($name, $key = null) { if (!array_key_exists($name, self::$config)) { self::set($name); } if ($key and !array_key_exists($key, self::$config[$name])) { throw new Error("В массиве конфигурации {$name} параметр {$key} не найден"); } return $key ? self::$config[$name][$key] : self::$config[$name]; } private static function set($name) { $config_file = "config/{$name}.php"; if (!is_file($config_file)) { throw new Error("Конфигурационный файл {$config_file} не найден"); } $array = require_once $config_file; if (!is_array($array)) { throw new Error("Конфигурационный файл {$config_file} не имеет массива данных"); } self::$config[$name] = $array; } } чем не контейнер от самоделкина с бодуна чего не наваяешь запрашивай по ключу чего нет добавит и вернёт и даже инклудить не будет каждый раз, будет брать с уже добавленного
Моя твоя не понимать. Свяжи слова с каждой переменной. --- Добавлено --- ты не ответил на вопрос. Уже что-то другое подкидываешь. Реши сначала одну проблему. Почему у тебя переменная без массива ? --- Добавлено --- .... Ты зачем из контейнера превратил в недо-автозагрузчик классов, но он не загрузчик классов, а в конфиго-что-за ? а что.. стоп, мы про контейнер диалог вели емае Это что за гидро-насос-био-статическая-бита для отпугивания инопланетян ? --- Добавлено --- с чего это вдруг set приватным методом стал ? а как собираешься контейнер наполнять ? не.. это.. а что это такое ? --- Добавлено --- Не путай Container !== Config
Все возможные конфиги сливаются в один массив https://www.php.net/manual/ru/function.array-merge-recursive.php после идут в класс config, далее PHP: <?php [ 'one' => [ 'two' => [ 1,2,3 ], 'u' => [ 'data' => true ] ] ] /* ... */ $config = $container -> get( \Config :: class ); /* [ 1, 2, 3 ] */ $config -> get( 'one.two' ); /* true */ $config -> get( 'one.u.data' ); /* null */ $config -> get( 'one.u.key' ); /* set value for directory 'one.u.key' => 'text' */ $config -> set( 'one.u.key', fn( &$v ) => $v = 'text' ); /* string 'text' */ $config -> get( 'one.u.key' ); --- Добавлено --- Но мы про контейнер говорим. Причем тут конфиги ?
нет, не идут, идут только по требованию можно расширить класс: удалять массив после того как он получен либо получены все его элементы вот теперь немного становится понятно как должен работать контейнер, а не таскать за собой кучу готовых объектов из объекта в объект и думать: а чего это реген страницы полсекунды вместо одной тысячной и при онлайне в 10 человек сайт падать тупо стал))) возьми понасоздавай нужных функций, заинклудь их перед автолоадером и используй где угодно, зачем тебе обманывать себя словом - контейнер
Ну чтоб до пол секунды довести, надо насовать объектов очень много в контейнер. Ну и есть методы этого избежать, Lazy-инициализация есть в php-di. Смысл контейнера в том, что все общие сервисы как раз таки один раз описаны. А потом, при использовании автовайринга особенно PHP: class A { // Новая крутая фишка php 8 - одновременное объявление и инициализация свойства в конструкторе public function __construct(private DependencyClass $dependency) {} public function someMethod() { $this->dependence->someMethodOfDependency(); } } $a = $container->make(A::class); // Если зависимость настроена, она подставляется сама собой А если ещё нормальный роутер реализован/использован, то про контейнер зависимости знает только он, не надо держать глобальную переменную $container держать, он сам перед вызовом контроллера все зависимости разрешит.
в смысле по требованию ? Это конфиги и их изначально заливают в проект. Это тебе не spl_autoload_register В них ничего не работает, а если например с БД загрузить соединение - то делаешь это с помощью ЗАМЫКАНИЙ. И по требованию эти замыкания ОДИН раз дергаются (см. как реализация еще создана). Это хоть понятно ? Нафига ? Это тебе не resource GD и т. д. PHP служит чтобы умереть - это ничего не говорит ? В ботах да, лишнее удалять, РАЗУМНО удалять, но конфиги чистить... кхм.. жизнь сложилась не так ? Зачем удалять ? Ровно через 2 года, если ты не кинешь изучать PHP, вернись в копию этих слов. Стыдно ? я знаю, еще как будет. А если множество аргументов ? Описание над каждым свойством ? уже одна фишка прогорела: PHP: public array $a, int $b, // syntax error $c; --- Добавлено --- Но я хочу php 8 --- Добавлено --- хочу как в с++ PHP: <?php struct fff { private Class_name1; public int $a = 0; } class test { public function __construct( fff ...$set ) {} } --- Добавлено --- почему до сих пор не загнали фишку с контролем множественных типов PHP: public function name( int | array $value ): int | array { ... return $value; } ибо существует лишь ?array null or (others type)
Да запросто. Но что-то я от тебя не ожидал, что ты php 8 пропустишь Ты же всегда рисуешь на самом новом пыхе код несчастным новичкам, которые все как один ставят денвер с 5.3 . 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