gpt4 book ai didi

php - 从父类访问子变量?

转载 作者:可可西里 更新时间:2023-10-31 22:43:31 26 4
gpt4 key购买 nike

我该怎么做?

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(); 表示 undefined variable “num”。

http://ideone.com/WM7tHk

如何访问这个变量?

最佳答案

你不应该这样做,因为你要求 parent 访问它可能或不存在的东西。

最简单的方法是在 parent 中声明 $num。否则,您需要采取措施,通过提供(例如) protected 抽象静态 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.
}
}

小改进

为确保通信时每个对象都在同一 block 板上,您可以使用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;
}

然后初始化会将对象的键设置为默认值,尝试设置不存在的键可能会引发异常。当然你需要仔细规划在不同的子类中需要设置哪些信息,以及如何设置;这实际上不是一个好的做法,因为更改现在往往会从子级级联到父级,然后再级联到 sibling 。

关于php - 从父类访问子变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22879334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com