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.

Reply via email to