От части согласен, но не вижу проблемы если использовать статические методы только для класс-специфичных вещей, а на ограничение до одного инстанса иду сознательно,
если честно, я просто не могу понять реальных проблем которых дает такое решение,
вот, например, есть объект приложения, его тоже надо делать не синглтоном? я сейчас про реальные потенциальные приложения на практике
для тестов можно будет всегда подменить зависимости и инициировать заново
Я понимаю, но разве мой вариант закрыт для расширения?
любой, кто имплементирует этот интерфейс имеет методы _класса_ с такими вот сигнатурами. По этому, вы можете вызывать эти методы, если оперируете с _экземпляром_ производным от DIPuttable.
У тебя твой класс жестко связан с классом контейнера. В нем прописано имя класса контейнера. Это значит что твой класс зависит от класса контейнера, хотя непосредственно для работы в этом нет никакой необходимости. Тут уже писали про сервис-локатор. Да, это вариант, но не лучший. Но он на порядок удачнее, чем твой первый вариант связка статического метода + впрыск в конструктор.И чисто практический вопрос - чем передача в конструктор зависимости лучше, чем получение из контейнера, как у меня?
А это и есть единственная причина. Инверсия контроля называется. При правильном применении позволяет значительно повысить качество кода по всем параметрам.Мм, одну причину сам вспомнил, есть фреймы которые могут сами определять потребности в объекта и передавать ему ту или иную зависимость, а еще?
Мм, одну причину сам вспомнил, есть фреймы которые могут сами определять потребности в объекта и передавать ему ту или иную зависимость, а еще?

естественно, для этого значение которое возвращает функция getDIKey в классе OtherClass1_Fake должно совпадать с OtherClass1PHP:class OtherClass1{} class OtherClass1_Fake{}DIContainer::set(OtherClass1::getDIKey(), new OtherClass1_Fake()); \DIContainer::get(OtherClass1::getDIKey())->getInstanceFromDI(); // Seems class hasnt been initiated yet
да, я сделал ошибку, методы в интерфейсе надо сделать статическимиУ тебя твой класс жестко связан с классом контейнера. В нем прописано имя класса контейнера. Это значит что твой класс зависит от класса контейнера, хотя непосредственно для работы в этом нет никакой необходимости. Тут уже писали про сервис-локатор. Да, это вариант, но не лучший. Но он на порядок удачнее, чем твой первый вариант связка статического метода + впрыск в конструктор.
да, я сделал ошибку, методы в интерфейсе надо сделать статическими
Если честно не понял, как набор методов у объекта может быть изменен динамически? Js, python да, но как в php уже созданному объекту добавить метод?
И в любом случае ведь полиморфность проявляется как раз в перегрузке методов класса, а не объекта, разве я не прав?
function doSomething(DIPuttable $puttable);