覆盖父类和子类之间的受保护变量

时间:2013-03-15 12:08:11

标签: php

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。

问题3:如何为创建的变量添加更多参数?比如,而不是受保护的$ var protected const $var对我来说意义更大。是不是PHP不支持,或者根本不支持OOP? (也许它得到支持,我不知道怎么办?)

问题4:如果我在父类中定义一个方法,我可以在没有$ this的情况下到达它吗?与load('homepage')一样。

非常感谢!

3 个答案:

答案 0 :(得分:1)

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

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

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

Q1:你确实达到了它。

Q2:无法使用受保护的变量强制执行。只是不要编写执行此操作的内容。您可以使用getter和setter来实现此目的。

问题3:PHP不支持此功能。

问题4:不会。如果在对象内部使用PHP,它总是需要$this来处理它自己的实例。

答案 1 :(得分:0)

  

Q1:如果我想要达到子类的$ database变量,我该如何到达它?

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

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

  

Q2:我怎样才能确保子类中的$ database变量不能被子类更改/覆盖,即使在自己中也是如此?

您可以声明private。但是,在我看来,使用private是代码气味。你应该把它们分成两个单独的类,然后通过组合将它们组合起来。

  

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

不知道你的意思。

  

问题4:如果我在父类中定义一个方法,我可以在没有$ this的情况下到达它吗?像加载('主页')。

你做不到。这就是PHP的工作方式。

答案 2 :(得分:0)

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

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

A3 :PHP没有像final这样的关键字,例如Java。 PHP知道关键字const,但这与“一次写入永不再写”有不同的含义。查看const的手册。

A4 :不,语言限制了。没有$this PHP不会知道您想要访问方法或属性。您可能想要访问全局函数或本地变量(将创建)。