我希望能够在父构造函数中设置私有属性的值,并在子构造函数或方法中调用该值。
例如:
<?php
abstract class MainClass
{
private $prop_1;
private $prop_2;
function __construct()
{
$this->prop_2 = 'this is the "prop_2" property';
}
}
class SubClass extends MainClass
{
function __construct()
{
parent::__construct();
$this->prop_1 = 'this is the "prop_1" property';
}
public function GetBothProperties()
{
return array($this->prop_1, $this->prop_2);
}
}
$subclass = new SubClass();
print_r($subclass->GetBothProperties());
?>
输出:
Array
(
[0] => this is the "prop_1" property
[1] =>
)
但是,如果我将prop_2
更改为protected
,则输出将为:
Array
(
[0] => this is the "prop_1" property
[1] => this is the "prop_2" property
)
我对OO和php有基本的知识,但是当prop_2
为private
时,我无法弄清楚是什么阻止{{1}}被调用(或显示?);它不能是私人/公共/受保护的问题,因为'prop_1'是私有的,能够被调用和显示......对吗?
分配子类与父类的值是一个问题吗?
我很感激帮助理解原因。
谢谢。
答案 0 :(得分:6)
无法在Child类中访问父类的私有属性,反之亦然。
你可以这样做
abstract class MainClass
{
private $prop_1;
private $prop_2;
function __construct()
{
$this->prop_2 = 'this is the "prop_2" property';
}
protected function set($name, $value)
{
$this->$name = $value;
}
protected function get($name)
{
return $this->$name;
}
}
class SubClass extends MainClass
{
function __construct()
{
parent::__construct();
$this->set('prop_1','this is the "prop_1" property');
}
public function GetBothProperties()
{
return array($this->get('prop_1'), $this->get('prop_2'));
}
}
答案 1 :(得分:6)
如果要从子类访问父级属性,则必须使父级属性受到保护而不是私有。这样他们仍然无法进入外部。 您不能以您尝试的方式覆盖子类中父级的私有属性可见性。
答案 2 :(得分:2)
正如其他人所说,您需要将父级的属性更改为protected
。但是,另一种方法是为您的父类实现get
方法,允许您访问该属性,或者如果您希望能够覆盖它,则可以实现set
方法。
所以,在你的父类中,你要声明:
protected function setProp1( $val ) {
$this->prop_1 = $val;
}
protected function getProp1() {
return $this->prop_1;
}
然后,在您的子课程中,您可以分别访问$this->setProp1("someval");
和$val = $this->getProp1()
。
答案 3 :(得分:0)
使用lambdas有一个简单的技巧,我在这里找到:https://www.reddit.com/r/PHP/comments/32x01v/access_private_properties_and_methods_in_php_7/
基本上,您使用lambda并将其绑定到实例,然后可以访问它的私有方法和属性
关于lambda调用的信息:https://www.php.net/manual/en/closure.call.php