PHP - “神奇变量值” - 酷还是傻瓜? [关闭]

I have some questions about designing a code framework using Dependency Injection:

FLOW3 or Doctrine uses Annotations to inject class instances to object properties. This is done with Code Reflection... and the performance is baaaaad :D

What do you think about this approach?

class Test extends Injector {
    protected $abc = '@Inject:/namespace/classname';
}

The Injector just loop through the class properties and finds if the string begins with @Inject and create object of given class.

Is it cool or does it suck?

If you're not using a cache with Doctrine's annotations (which are more elegant than your solution, which would be insanely difficult to debug [which is actually the only problem with it other than in the case that you need a string with '@Inject' in it] if something went wrong), then you're doin' it wrong. In a production environment, if you set up caching properly (see the docs) you won't have any issues :)

Well .. working with reflections IS slow. That is indisputable. But there is a viable workaround for this: use APC to cache the dependencies for each class instance.

That said, you must understand, that what you are talking about is not dependency injection (which is design pattern), but dependency injection container (DIC).

DICs are usually frameworks (or parts of them) which attempt to automatize the process of using dependency in your code. This usually and up service locator (a pretty name for "global registry") anitpattern, with various levels of harmfulness.

So ... my suggestion would be this:

  • if you have no choice to codebase, which uses DIC - uses caching. Extensively.
  • if you are not restricted to specific 3rd part libraries/frameworks - use manual dependency injection