Not only that. This potentially might break compatibility with many
software products already out there. Also, this might lead to many
misunderstandings and, in fact, ambiguous code. Consider the sample.

$name = 'something';
$something = $name(); // What is this - a function call or object?

Fact is, we can not know that unless a) do a search in code b) var_dump?


2013/3/18 Pierre du Plessis <pie...@pcservice.co.za>

> 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