gpt4 book ai didi

php - 从子方法访问时,父方法设置的父类属性为空

转载 作者:行者123 更新时间:2023-12-04 00:47:22 24 4
gpt4 key购买 nike

我无法理解为什么我可以从我的父类访问一个属性,但它是 NULL,即使它已经由父类设置(并且没有被故意重置)。我认为这可能是因为该属性是由私有(private)方法设置的,但是当我更改为 public 时没有区别。这是一个彻底简化的示例:

class TheParent
{

protected $_parent_property;

function __construct()
{}

private function parent_method($property);
{
$this->_parent_property = $property;
$call = new TheChild;
$call->child_method();
}
}

class TheChild extends TheParent
{
function __construct()
{
parent::construct();
}

public function child_method();
{
echo $this->_parent_property;
exit;
}
}

$test = new TheParent;
$test->parent_method('test');

当 child 由父级构造时,我通过将父级属性传递给子级来解决这个问题,即 new TheChild($this->_parent_property),但我仍然不明白为什么 $ this->_parent_property 在我的原始示例中从 child 访问时设置为 NULL。

我确实知道,如果我从父构造函数中设置此属性,我就可以正常访问它。我试图理解为什么由父方法设置并可由其他父方法访问的属性不能从扩展父类的子类访问。

谁能解释一下?谢谢!

最佳答案

问题是您正在创建一个未设置变量的新实例。该属性绑定(bind)到一个特定的实例,因此您正在创建父级的一个实例,然后从父级创建另一个子级实例,其中包括创建新父级将包含的所有内容,包括 $_parent_property。当您读取子项中的值时,您正在读取的是新创建的父项的值,而不是您之前创建的值。

实际上,你这样做:

A = new TheParent()
A->_parent_property = 'test'

调用:B = new TheChild() 在幕后,这是 new TheParent()

Print B->_parent_property(未初始化)

考虑这个将产生您预期结果的类似示例:

class TheParent
{

protected $_parent_property;

function __construct()
{
parent_method();
}

private function parent_method();
{
$this->_parent_property = 'test';
}
}

class TheChild extends TheParent
{
function __construct()
{
parent::construct();
}

public function child_method();
{
echo $this->_parent_property;
exit;
}
}

$child = new TheChild();
$child->child_method();

在此示例中,TheParent 中的私有(private)方法在 TheChild 创建的同一实例上调用,设置底层实例变量。

关于php - 从子方法访问时,父方法设置的父类属性为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6886277/

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