> Bart de Boer wrote:
>> Ken Stanley wrote:
>>
>
> ...

>> That's not right. Accessing the child class would only be possible from
>> within an instantiated object. Unlike parent::, you will never be able
>> to use static:: in a purely static context. Imagine there are multiple
>> child classes which all inherit from the same base class. If there's no
>> instance, PHP won't be able to know which child class to target with
>> child::, static:: or whateverkeyword:: since it can be any one of those
>> child classes.
>
> huh??? the 'child' class would refer to the class that was actually named
> when then call to the method was made (thats what late static binding
> means,
> does it not?):
>
> class Data {
>       static function getTableName() {
>               throw new Exception('WTF');
>       }
>
>       static function findRange() {
>               $t = child::getTableName();
>       }
> }
>
> class Prod {
>       static function getTableName() {
>               return 'PRODS';
>       }
> }
>
> Data::findRange(); // child = Data class
> Prod::findRange(); // child = Prod class
>

I think I misunderstood what was meant by late static binding. Thank you
for clearing that up. And my sincerest apologies to everyone to whom I
might have caused confusion.


> if you require a class instance in order to use 'child' then
> the whole point is moot - because you can already do
>
>       $child = get_class($this);
>
> inside the relevant function (assuming the function is not declared
> static,
> and why would you declare it as such if your requiring an instance to use
> 'child'?).
>

I thought late static binding had something to do with accessing static
_variables_ in child classes. You're currently solving that problem by
defining a static function getTableName() in the child class. But I think
that isn't very efficient when you're dealing with complex objects and/or
arrays which would need to be accessed frequently.

If it were possible your code example could be solved as:

<?php

class Data {
        static function findRange() {
                if (!child::$tableName)
                        throw new Exception('WTF');
                else
                        return child::$tableName;
        }
}

class Prod {
        static $tableName = 'PRODS';
}

?>

But it seems this feature request belongs in a different thread. :)



> maybe 'child' should be called 'callee' or even 'lsb' (that would make
> people
> hit the docs for sure :-)). alternatively maybe 'this' could be used as
> the LSB keyword:
>
>       this::foo();
>
> the samentics for determining what class is referred to with 'this::' is
> akin to
> that used for determining what class is referred with '$this->', no?
>
> MAYBE php6 should do late static binding for 'self', akin to other OO
> oriented
> scripting langs .. and just live with BC. I seriously wonder whether much
> code would
> break ... given that 'self' is not currently late binding how often would
> people have actually
> overwritten static methods ion child classes that are being called via the
> 'self' syntax
> in [parent] classes?
>

Now I understand why this:: might be confusing since it is meant for
objects. self:: would mean we can't access stuff in the current class
anymore. What about

derived::

or

extended::

?

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

Reply via email to