假设我们有一个超类(称为“Super”)和一个子类(称为“Sub”)。
class Super {
protected static $title = 'super';
public static function get_class_name()
{
echo __CLASS__;
}
public static function get_title()
{
echo self::$title;
}
}
class Sub extends Super {
protected static $title = 'sub';
}
现在,因为Sub扩展了Super,Sub现在将继承Supers的所有方法,然而,只接收到对Sub方法的引用。
我这么说是因为如果我调用函数:
Sub::get_class_name();
输出是“super”,而不是“sub”。
如果我调用:
Sub::get_title();
同样,输出是“super”,我甚至在Sub中声明了$title。
所以我的问题是,我是否可以扩展静态类,调用继承的方法之一,并拥有子类的作用域?或者至少能识别出它的类名?如果没有,我为什么要扩展静态类?
谢谢
发布于 2018-01-09 15:18:14
在PHP 5.3.0之前,这是不可能的。
后期静态绑定在PHP 5.3.0中引入,并允许你通过static
关键词。
class Super {
protected static $title = 'super';
public static function get_class_name()
{
echo __CLASS__;
}
public static function get_title()
{
echo static::$title;
}
}
class Sub extends Super {
protected static $title = 'sub';
}
get_class_name()
还会回来Super
虽然__CLASS__
始终返回正在运行的方法在__FILE__
它总是返回当前文件,不管是否包含它)。
为此,你别无选择,只能在Sub调用
。
class Super {
protected static $title = 'super';
public static function get_class_name()
{
echo __CLASS__;
}
public static function get_title()
{
echo static::$title;
}
}
class Sub extends Super {
protected static $title = 'sub';
public static function get_class_name()
{
echo __CLASS__;
}
}
发布于 2018-01-09 16:32:33
你可以用get_called_class()
若要获取你正在调用的类的类名,即使它是静态的。你不必在任何地方声明。
例子:
class Super {
public static function get_class1_name()
{
echo __CLASS__;
}
public static function get_title()
{
echo get_called_class();
}
}
class Sub extends Super {
public static function get_class2_name()
{
echo __CLASS__;
}
}
Sub::get_title(); // Echos Sub.
Sub::get_class1_Name(); // echos super
Sub::get_class2_Name(); // echos sub
因此,你不必声明任何变量。
https://stackoverflow.com/questions/-100007126
复制相似问题