0
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 子级不应该触摸它。)现在就是这样,但我不知道为什么。

Q3:如何为我创建的变量添加更多参数?就像受保护的 $var protected const $var对我来说更有意义。它只是 PHP 不支持,还是 OOP 根本不支持?(也许它受支持,我不知道如何?)

Q4:如果我在父类中定义了一个方法,我可以不使用$this来访问它吗?喜欢load('homepage')

非常感谢!

4

3 回答 3

1

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

如果您希望受保护的变量继续存在,您必须创建自己的版本__construct()来更改它。大概是这样的:

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

Q1:你确实达到了。

Q2:不可能使用受保护的变量强制执行。只需不要编写执行此操作的代码。您可以使用 getter 和 setter 来实现此目的。

Q3:PHP 不支持这个。

Q4:不。如果在对象内部使用 PHP 总是需要$this在它自己的实例上工作。

于 2013-03-15T12:15:51.320 回答
0

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

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

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

Q2:如何确保父类中的 $database 变量不能被子类更改/覆盖,即使在自己中?

你可以声明它private。但是,在我看来,使用private是一种代码味道。您应该将它们设为两个独立的类,并通过组合将它们组合起来。

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

不明白你的意思。

Q4:如果我在父类中定义了一个方法,我可以不使用$this来访问它吗?像加载('主页')。

你不能。这就是 PHP 的工作原理。

于 2013-03-15T12:13:34.943 回答
0

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

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

A3:PHP 没有像finalJava 那样的关键字。PHP 知道该关键字const,但这与“一次编写后不再编写”具有不同的含义。查找手册const

A4 : 不,又是语言限制。没有$thisPHP 就不会知道你想要访问一个方法或属性。您可能想要访问全局函数或局部变量(将被创建)。

于 2013-03-15T12:17:08.767 回答