我该怎么做?
class test
{
public static function run() {
echo "Number is: ".$num;
}
}
class testchild extends test
{
protected static $num = 5;
public static function exec() {
$num = 5;
parent::run();
}
}
testchild::exec();
表示未定义变量“num”。
如何访问此变量?
答案 0 :(得分:4)
您应该无法执行此操作,因为您要求家长访问其中可能或不的内容。
最简单的方法是在父中声明$num
。否则,您需要采取措施,通过提供(例如)受保护的抽象静态getter来保证系统信息将存在。
abstract class test
{
public static function run() {
echo "Number is: ".static::getNum();
}
protected abstract static function getNum();
}
class testchild extends test
{
protected static $num;
public static function exec() {
static::$num = 5;
parent::run();
}
protected static function getNum() {
return static::$num;
}
}
class anotherchild extends test
{
public static function exec() {
parent::run();
}
// We always return 42. Or maybe the Unix timestamp, who knows.
protected static function getNum() {
return 42;
}
}
$c = new testchild();
$c->exec();
另一个不那么可靠的方法是拥有一个“通信对象”并将引用传递给它。这可以使用属性数组或(更好)已知结构的对象以与上面相同的方式完成:
abstract class test
{
public static function run() {
echo "Number is: ".static::tell('num');
}
protected abstract static function tell($what);
// A concrete function to initialize the known object would be nice here.
}
class testchild extends test
{
protected static $info; // This is an array, out of laziness.
// It ought to be converted to an object.
public static function exec() {
static::$info['num'] = 5; // Typo here == possibly subtle bug.
parent::run();
}
protected static function tell($what) {
return static::$info[$what]; // array_key_exists would be nice here.
}
}
为了确保通信时每个对象都在同一块板上,您可以使用 setter 抽象通信对象(现在它也可以是一个数组):
public static function exec() {
static::say('num', 5);
parent::run();
}
protected static function say($what, $value) {
// array_key_exists would be nice here too.
static::$info[$what] = $value;
}
然后初始化会将对象的键设置为默认值,并且尝试设置不存在的键可能会引发异常。当然,您需要仔细规划需要在不同子类中设置哪些信息,以及如何;这不是一个好的做法,因为现在的变化往往会从一个孩子到一个孩子,从那里流向兄弟姐妹。
答案 1 :(得分:2)
class test
{
public static function run() {
$c = get_called_class(); //get child class variable in parent class
echo "Number is: ".$c::$num;
}
}
class testchild extends test
{
protected static $num = 5;
public static function exec() {
$num = 5;
parent::run();
}
}
testchild::exec();
输出: 数字是:5
您已经使用父类静态方法中的get_Called_class()函数获得了子类变量。
答案 2 :(得分:0)
您的父类应该包含它希望访问的变量,例如:
class test
{
protected static $num;
public static function run()
{
echo "Number is: ".self::$num;
}
}
class testchild extends test
{
public static function exec()
{
self::$num = 5;
parent::run();
}
}
testchild::exec();
此处,protected
限定符是必需的。这表示该变量只能由当前类及其后代访问。另一方面,私人不能被后代访问。