Called child´s constant not available in static function in parent
I have a static function in a class that needs to be called from several child classes. I need a constant from the calling child class to be available in that function. To have these constants available in other places, the child classes have a function that returns the value of that constant (php 5.2.9).
However, when in the parent class, I can´t seem to access that constant, not with the function nor directly. Is that even possible in php 5.2.9 or do I need to pass it as an argument?
This is a simple version of the code:
abstract class ParentClass {
static function DoSomething() {
$not_working = self::show_const();
$not_working_either = self::SOME_CONST;
return 'working';
}
}
class ChildClass extends ParentClass {
const SOME_CONST = 'some string';
function show_const() {
return self::SOME_CONST;
}
}
$result = ChildClass::DoSomething();
Edit: the error generated is:
- Call to undefined method ParentClass::show_const() (for funct开发者_如何转开发ion)
- Undefined class constant 'SOME_CONST' (using self::SOME_CONST)
Unfortunately, what you're trying to do isn't going to work pre 5.3. The problem here is early static binding versus late static binding. The self
keyword binds early, so it only looks in the class where it is used to resolve symbols. The magic constant __CLASS__
or the function get_class()
won't work either, these do early static binding as well. For this reason PHP 5.3 extended the static
keyword to mean late binding when used as static::some_method()
.
So in 5.3 this would work:
abstract class ParentClass {
public static function DoSomething() {
return static::show_const();
// also, you could just do
//return static::SOME_CONST;
}
}
class ChildClass extends ParentClass {
const SOME_CONST = 'some string';
public static function show_const() {
return self::SOME_CONST;
}
}
$result = ChildClass::DoSomething();
You need to make ChildClass extend parent class::
class ChildClass extends ParentClass {
Edit:
You're trying to refer to a constant and method in the child class from the parent class which doesn't know the child class' constant exists. It's a scope issue. The child can refer to the parent's methods and constants but not vice versa.
精彩评论