gpt4 book ai didi

PHP如何在扩展类中使用父类对象变量?

转载 作者:行者123 更新时间:2023-12-02 05:42:15 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





PHP Accessing Parent Class Variable

(8 个回答)


7年前关闭。




很抱歉,这似乎是一个初学者的问题。
如何访问其扩展类中的父类对象变量?

class FOO {
public $foo;
function __construct() {
$this->foo = 'string';
}
}

class Parent {
public $x;
function __construct() {
$this->x = new FOO();
var_dump($x); // this works
}
}

class Child extends Parent {
public $y;
function __construct() {
var_dump($this->x); // appears to be NULL all the time
}
}

如何正确传递 $x 的值或引用?

最佳答案

您的 Child类有自己的x属性(property)。 children 继承了所有非私有(private)的东西,所以所有 publicprotected属性/方法将可用。
您声明属性(property) x , 但直到 Parent 才被初始化构造函数被调用。如果子类(在本例中为 Child)有自己的构造函数,则父构造函数将被覆盖并且不会被自动调用

简而言之:您必须从子类中显式调用父类的构造函数:

class Child extends Parent
{
protected $y = 'Some string';//you can initialize properties here, too
//ALWAYS use access modifiers
public function __construct()
{
parent::__construct();//explicit call to parent constructor
var_dump($this->x);
}
}

请注意:如果父构造函数需要一个参数,那么子构造函数也必须这样做(签名必须匹配)。参数类型应该是兼容的(如果不是:违反契约(Contract)),并且您可能希望将参数传递给父构造函数,以便它也能完成它的工作。

顺便说一句,让构造函数创建类内部需要的新实例被认为是不好的做法。谷歌:S.O.L.I.D.,特别注意依赖注入(inject)和里氏原理,以及类型提示。
如果你通读了这些 Material ,你就会明白为什么这是编写代码的更好方法:
class Dad
{
/**
* @var Foo
*/
protected $x = null;

public function __construct(Foo $foo)
{
$this->x = $foo;
}
}
//child
class Son extends Dad
{
/**
* @var string
*/
protected $y = 'Some string';

public function __construct(Foo $foo)
{
parent::__construct($foo);
}
public function test()
{
$results = array();
$results[] = '$this->x instanceof Foo ? '.($this->x instanceof Foo ? 'Of course!': 'No');
$results[] '$this instanceof Son ? '.($this instanceof Son ? 'Yup' : 'No?');
$results[] '$this instanceof Dad ? '.($this instanceof Dad ? 'Yes!' : 'No?');
return $results;//methods don't echo, they return...
}
}
$son = new Son(new Foo());
echo implode(PHP_EOL, $son->test());

此代码的输出将是
$this->x instanceof Foo ? Of Course!
$this instanceof Son ? Yup
$this instanceof Dad ? Yes!

这似乎使许多(相对)OOP 新手感到困惑,但子类与其父类属于同一类型。如果你仔细想想,这是有道理的。对于外部世界(即,在给定类的实例上工作的代码),只有公共(public)方法是可见的。根据定义, child 继承了所有公开的东西,所以对于外界来说,这并不重要。
如果某段代码需要 Dad实例做某事,然后一个 Son也可以,因为 Dad提供,一个 Son也可以。子类唯一要做的就是添加父类已经提供的功能。

关于PHP如何在扩展类中使用父类对象变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24555090/

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