On 18/03/2013, at 6:07 PM, Matīss Roberts Treinis <mrtrei...@gmail.com> wrote:

> 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.
>> 

This works well in languages like JavaScript where functions are objects.
As much as I like the feature there, I'm not sure it's a great fit for PHP.

David

Sent from my iPhone
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to