Le Thu, 19 Nov 2009 12:06:19 +0100, Mathieu Suen a écrit : > Alban a écrit : >> Le Thu, 19 Nov 2009 02:24:01 +0000, Jared Williams a écrit : >> >>>> -----Original Message----- >>>> From: Robert Lemke [mailto:rob...@typo3.org] Sent: 18 November 2009 >>>> 16:07 >>>> To: internals@lists.php.net >>>> Subject: [PHP-DEV] RFC: Custom Factories (SPL) >>>> >>>> Hi folks, >>>> >>>> after discussing the idea with various PHP developers I now felt safe >>>> enough that it's not a completely stupid idea to post an RFC for it. >>>> The idea is to add support the registration of custom factories which >>>> are responsible for instantiating certain classes. >>>> >>>> Here is the first draft of my RFC: >>>> http://wiki.php.net/rfc/customfactories >>>> >>>> I suggest that we first discuss the implications and usefulness of >>>> this feature. In a second step I'd need to find some skilled >>>> internals wizard who can implement it, because not being a C >>>> developer myself, all I can offer is making suggestions and fine >>>> coffee. >>>> >>>> Looking forward to hearing your comments! Robert >>>> >>>> -- >>>> Robert Lemke >>>> Fluent Code Artisan >>>> >>>> >>> Whilst I am a fan of IoC, I don't think its desirable to add language >>> features just to make legacy code more flexible. Surely the route to >>> take is to refactor the legacy code as and when the extra flexibility >>> is needed. >>> >>> Also seems like a possible whole heap of wtf?! When a seemingly >>> absolute statement $a = new A(); gets mangled behind the scenes. >>> >>> Jared >> >> I'm totaly agree with you Jared ! >> I'm a fan of IoC too. >> >> A factory can provide an object by creating an instance of a class, the >> choice of the class depends of some paramters. Those parameters can be >> provided directly by the programmer but also by a final user. PHP can >> not simply "choose" the class to instanciate by checking class's >> interfaces. >> >> What Robert Lemke wants to implement is called a "Service" or a >> "Container". >> You register a service and call the service instead of calling a class >> directly. >> >> Let me show it in an example of session registration : >> >> // you register the service >> Services::register('session', 'sessionStoredInCookie'); >> >> // and call it >> $session = Services::load('session'); >> >> Tomorrow, if you want change the session registration mechanism, for >> storing them in a database for exemple, you have just to change the >> registred service and whole application has change its session >> registration method : >> >> // you register the service >> Services::register('session', 'sessionStoredInDatabase'); >> >> This is very well treated by Fabien Potencier in this document : >> http:// >> fabien.potencier.org/talk/20/decouple-your-code-for-reusability-php- >> forum-2008?position=41 (some parts are in french) >> >> Implementing a service or container mechanism could be very simple or >> very complicated. Fabien Potencier use a very complicated example in >> the link above. >> >> Use a service or container mechanism (and its implementation) is a >> developper choice. this could not be traced by php core. >> >> A service (or container) can create an instance of class or just return >> an instance of class which is allready created. >> >> // you register the service >> Services::register('databaseConnexion', new databaseConnexionFactory >> ('mysql', array('server', 'database', 'user', 'password'))); >> >> // and call it >> $db = Services::load('databaseConnexion'); >> >> How PHP should treat the singleton ? getInstance() is just a >> convention. Create a service mechanism directly in php implies that php >> implements singleton model too. >> >> > Some language have support for IoC. See newspeak: > http://gbracha.blogspot.com/2009/07/ban-on-imports-continued.html > > > -- Mathieu Suen
That's a good idea to add support of IoC in PHP. But i think a mechanism like spl_autoloader doesn't sounds very well. I prefer see a mechanism like import/export, something like this : -- file a.php -- import B class A { public function hello() { $b = new B(); $b->hello(); } } -- file myB.php -- class myB { public function hello() { echo "Hello, I'm myB"; } } -- file otherB.php -- class myB { public function hello() { echo "Hello, I'm otherB"; } } -- file main.php -- require_once 'a.php'; require_once 'myb.php'; require_once 'otherb.php'; export myB as B; $a = new A(); $a->hello(); // print : "Hello, I'm myB"; export otherB as B; $a->hello(); // print : "Hello, I'm otherB"; This is like the 'use' command for class alias, at the difference that the 'use' command works localy and it resolved at the compilation time. -- Alban Leroux s...@paradoxal.org -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php