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将不知道您想要访问一个方法或属性。您可能想要访问一个全局函数或一个局部变量(它将被创建(。