【发布时间】:2021-01-25 15:49:22
【问题描述】:
我有一个继承自父对象的子对象。两者都有一个静态变量,每个对象都有不同的值;当我实例化孩子时,我想将该变量从父母和孩子添加到数组中。为了节省重复代码,我在父构造函数和子构造函数都调用的父构造函数中编写了一个方法 (addFoo)。但是,当从子构造函数调用父构造函数时,我似乎找不到区分调用的方法(如下所示,无论使用$this,两种情况下方法的输出都是相同的, self 或 static)。
class A {
public static $foo = 'foo';
public $thisvars = array();
public $selfvars = array();
public $staticvars = array();
public function __construct() {
$this->addFoo();
}
public function addFoo() {
$this->selfvars[] = self::$foo;
$this->staticvars[] = static::$foo;
$this->thisvars[] = $this::$foo;
}
}
class B extends A {
public static $foo = 'bar';
public function __construct() {
parent::__construct();
$this->addFoo();
}
}
$b = new B;
print_r($b->selfvars);
print_r($b->staticvars);
print_r($b->thisvars);
输出:
Array
(
[0] => foo
[1] => foo
)
Array
(
[0] => bar
[1] => bar
)
Array
(
[0] => bar
[1] => bar
)
我可以通过将调用类传递给addFoo 函数来解决这个问题(见下文),但有更好的(正确的?)方法吗?
class C {
public static $foo = 'foo';
public $vars = array();
public function __construct() {
$this->addFoo(__CLASS__);
}
public function addFoo($class) {
$this->vars[] = $class::$foo;
}
}
class D extends C {
public static $foo = 'bar';
public function __construct() {
parent::__construct();
$this->addFoo(__CLASS__);
}
}
$d = new D;
print_r($d->vars);
输出:
Array
(
[0] => foo
[1] => bar
)
【问题讨论】:
-
从
say的角度来看,当前对象是B类的一个实例(因为这就是你要实例化的对象),所以从哪里调用它并不重要:它总是会给出相对于B的结果(__CLASS__和self除外,因为它们本身指的是当前类,但这无济于事)。恐怕其他任何试图弄清楚的事情都必须是一个肮脏的技巧,例如解析堆栈跟踪。知道您尝试使用该代码解决哪些问题会很有趣,因为可能还有其他方法可以解决这些问题。 -
@Jeto 谢谢;这就是我的理解。我要解决的问题是我有一个父对象,该对象具有一组需要传递给构造函数的必需属性;这些需要存在于父级及其子级的所有实例中。子可能有额外的必需属性,我想使用相同的函数来处理父(来自父构造函数)和子(来自子构造函数)的必需属性。
-
@Jeto 我已经重写了这个问题,使其更接近我的实际情况,并希望更加不言自明。
-
如果希望特定的父函数可以被子函数调用,可以设置
protected,例如protected function addFoo() -
@DonnyAkhmadSeptaUtama 这些函数是公开的,因此孩子已经可以调用它们。