On Mar 18, 2013 2:41 AM, "Thomas Bley" <thbley+...@gmail.com> wrote:
>
> On Sat, Mar 16, 2013 at 9:33 PM, Pierre du Plessis
> <pie...@pcservice.co.za> wrote:
> > On Mar 16, 2013 9:35 PM, "Daniele Orlando" <dnl.r...@gmail.com> wrote:
> >>
> >> Hi List,
> >>
> >> I'm interested in proposing an RFC and I would know your opinion.
> >>
> >> === Current Situation ===
> >> Since PHP 5.3 we can use an object instance, who defines the __invoke()
> >> method, as a callable object.
> >> Example:
> >>
> >> // PHP Code.
> >> class Runnable
> >> {
> >>     public function __invoke()
> >>     {
> >>         echo "Runned";
> >>     }
> >> }
> >>
> >> $r = new Runnable();
> >> $r();
> >>
> >> // Output
> >> Runned
> >>
> >> === The Idea ===
> >> In Python, when you construct an object, you don't need to use the
"new"
> >> keyword but you just invoke the class name followed by "()", like the
> > class
> >> is a function.
> >> Example:
> >>
> >> // Python Code.
> >> class A:
> >>     pass
> >>
> >> A()
> >>
> >> // Output.
> >> <__main__.A instance at %address>
> >>
> >> Now, would be interesting to extend the PHP __invoke() method adding an
> >> __invokeStatic() method, like happens with __call() and __callStatic()
> >> methods.
> >> In this way could be possible to use a class name to invoke the
> >> __invokeStatic() method.
> >> Example:
> >>
> >> // PHP Code.
> >> class TrueRunnable
> >> {
> >>     public static function __invokeStatic()
> >>     {
> >>         echo "Runned";
> >>     }
> >> }
> >>
> >> TrueRunnable();
> >>
> >> // Output.
> >> Runned
> >>
> >> But the possibility are endless:
> >>
> >> class A
> >> {
> >>     public static function __invokeStatic()
> >>     {
> >>         return new A();
> >>     }
> >>     public method m() {}
> >> }
> >>
> >> A()->m();
> >>
> >> // or
> >>
> >> class A
> >> {
> >>     private $_instance;
> >>     public static function __invokeStatic()
> >>     {
> >>         // Singleton pattern.
> >>         if (self::$_instance) {
> >>             return self::$_instance;
> >>         }
> >>
> >>         return self::$_instance = new A();
> >>     }
> >>     public method m() {}
> >> }
> >>
> >> A()->m();
> >>
> >>
> >> === Conclusion ===
> >> This feature makes the __invoke() method consistent with the __call()
and
> >> __callStatic() methods,
> >> and opens the door to many cool stuff.
> >>
> >> Any feedback is appreciated.
> >>
> >> Daniele Orlando
> >
> > I don't really see a use case for this, as you can already use the
syntax
> > A::method();
> >
> > E.G class A { public static function invoke() { return new A; }
> >
> > public function m() { echo 'Runned'; }
> >
> > A::invoke()->m();
> >
> > Your example above only saves a few characters to type and can lead to a
> > lot of problems if you have a function with the same name as the class.
>
> Using A::invoke(), you need to know the name of "invoke()" and it's
> hard to force users always to use the invoke() function.
> Using A() would be more clean since all the static init(), factory(),
> invoke(), getInstance() are gone.
> Having __call(), __callStatic(), __invoke() and invokeStatic() would
> make the overloading concept more consistent.
>
> Regards,
> Thomas
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>

Using A() looks too much like a function call. And there is still the issue
with having a function name the same as the class name.

Reply via email to