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

Reply via email to