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')
一样。
非常感谢!
答案 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不会知道您想要访问方法或属性。您可能想要访问全局函数或本地变量(将创建)。