Re: Feature Request: dependencies container
| From: | Marco Pivetta | Date: | Mon, 03 Aug 2020 04:28:23 +0000 |
| Subject: | Re: Feature Request: dependencies container | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-111292@lists.php.net to get a copy of this message | ||
Re-writing with the internals ML in CC
On Mon, Aug 3, 2020, 06:16 3u93n3 <zsidelnik@gmail.com> wrote:
> > 2. Setter injection (as well as property injection, and also the
> proposed
__inject) leads to temporal coupling smells. Explained
> otherwise, your object instances are not "functioning" right after
> instantiation, which makes their API more complex and reduces reliability
> (they are broken until injection has happened). Please just use the
> constructor: it works, and it is a simple pre-existing injection point 👍
>
> Please, read the attachment. __inject should be called right
> before
> __construct. Thus, objects are consistent.
> In constructor we could use all injected dependencies.
>
Yes, I checked the document. The same problem applies, since you bow have
an object that doesn't function anymore if not put in the context of a DIC.
The design of the proposed DIC is not usable, because it proposes a
singleton DIC that operates via register_dependency_bindings(...), and
which overloads the new operator.
In practice, by doing this, you are adding a lot of state and complexity to
the language, since a new Foo() call can now implicitly mean that a
global dependency binding is used to determine which parameters are passed
to Foo#__inject(), which is almost as effective as code obfuscation.
In addition to that, new Foo() may mean different things depending on the
time at which it is called, since dependencies may have been changed in
between.
There's absolutely nothing wrong with passing your dependencies explicitly
to your constructors: it makes the dependency graph clear.
You can design the same concept of dependency resolver with an AST
preprocessor and the current __construct() semantics 👍
Alternatively, you can check the gazillion pre-existing DICs out there:
auryn probably doing what you want, but with much healthier structure.
>