重写父类和子类之间的受保护变量


Overriding protected variables between parent and child classes

abstract class BaseController
{
    protected $arctica, $database, $content, $cacheTime;
    function __construct($arctica)
    {
        $this->arctica = $arctica;
        $this->config = $arctica->config;
        $this->database = $arctica->database;
    }
class Controller extends BaseController
{
    protected $cacheTime = 2;
    protected $database = 'override'; //trying to override database var
    function __construct($arctica)
    {
        parent::__construct($arctica);
    }
    function Run()
    {
                    var_dump($this->database); //A class instance, not string('override')
        $this->load('homepage');
    }
}

我想问一些关于这门课的事情。

Q1:如果我想达到$database variable of child class,我该如何达到它?

Q2:如何确保$database variable in parent class不会被子类更改/覆盖,即使是在自身中?($database应该是一个固定的数据库实例,所以Controller的孩子不应该碰它。(现在是这样,但我不知道为什么tbh。

Q3:如何在创建的变量中添加更多参数?比如,代替受保护的$var protected const $var对我来说更有意义。这是PHP不支持的东西,还是OOP根本不支持的?(也许它是支持的,我不知道怎么支持?(

Q4:如果我在父类中定义了一个方法,我可以在没有$this的情况下访问它吗?像load('homepage')

非常感谢!

您的代码从$arctica对象中获取数据库信息。那里的信息被使用了,既不是抽象类中的受保护变量,也不是扩展类中的。

如果希望受保护的变量继续存在,则必须创建自己版本的__construct()来更改此设置。可能是这样的:

public function __construct($arctica) {
    parent::__construct($arctica);
    $this->database = "override";
}

Q1:你确实达到了。

Q2:无法使用受保护的变量强制执行。简单地说,不要编写这样的代码。您可以使用getter和setter来实现这一点。

Q3:PHP不支持此功能。

Q4:没有。如果在对象内部使用,PHP总是需要$this来处理自己的实例。

Q1:如果我想访问子类的$database变量,我该如何访问它?

如果它被声明为protected,则可以从父级或子级使用$this->database访问它。

如果是private,您可以通过$this->database访问它,但只能从父级访问。

Q2:如何确保父类中的$database变量不会被子类更改/覆盖,即使是在self中也是如此?

您可以将其声明为private。然而,在我看来,使用private是一种代码气味。你应该把它们做成两个单独的类,并通过组合把它们组合起来。

Q3:如何在创建的变量中添加更多参数?

不知道你的意思。

Q4:如果我在父类中定义了一个方法,我可以在没有$this的情况下访问它吗?类似负载("主页"(。

你不能。PHP就是这样工作的。

A1:BaseController无法访问其子类的属性。BaseController甚至不知道自己有孩子。您可以将其设为abstract,并强制其子级实现getter,以便BaseController可以通过getter访问属性值。

A2:将BaseController中的database设为private,这样只有BaseController可以访问它。然后在BaseController中定义一个受保护的getter,这样子类就可以通过getter而不是直接访问database

A3:PHP没有像Java那样的关键字final。PHP知道关键字const,但这与"写一次就不再写"有不同的含义。查阅const的手册。

A4:不,再次受到语言限制。如果没有$this,PHP将不知道您想要访问一个方法或属性。您可能想要访问一个全局函数或一个局部变量(它将被创建(。