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:[email protected]] Sent: 18 November 2009
>>>> 16:07
>>>> To: [email protected]
>>>> 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 [email protected]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php