嗨,我想知道是否有人可以为我解释以下问题。
我有两个班级
第1课
class application{
private $something = "hello my name is";
function __construct(){
$this->something .= " bob";
$this->require_login_class_method();
}
public function getName(){
return $this->something;
}
...
}
第2课
class login extends application{
function __construct(){
echo $this->getName();
}
}
我的结果总是
“我的名字是”
没有
“鲍勃”
但是,如果我打电话(在班级登录 - 构建)
parent::__construct();
它有效。
如果我的应用程序类构造方法接受我不想传递的变量或者不需要第二次传递(从登录时),该怎么办?
提前致谢
解决方案
感谢所有回复的人。
到目前为止我收集的解决方案是执行以下操作
班级申请
//if variables are present, make them optional
function __construct($var1 = null, $var2 = null){
//do something
}
班级登录
function __construct(){
parent::__construct();
//do something with variables set in parent construct
}
答案 0 :(得分:4)
如果扩展类,则可以覆盖构造函数。如果你这样做,你必须为自己完成在该构造函数中完成的所有工作。 您也可以调用父构造函数,并在那里调用所有工作。实际上并没有第三种选择:你要么叫它,要么你没有。
答案 1 :(得分:2)
在OO中,您可以覆盖方法。因此,您覆盖了父类(意味着在调用子类时不会执行它)
您可以调用任何父方法parent::anyMethod()
这是它的工作原理。
答案 2 :(得分:2)
我认为严格的标准要求你的子构造函数接受与其父类相同的变量,但如果你想绕过它,你总是可以在父构造函数中使变量成为可选:
function __construct($name = " bob"){
$this->something .= $name;
$this->require_login_class_method();
}
当然,如果你覆盖构造函数,你必须手动从孩子那里调用它,如果你想要调用它。
答案 3 :(得分:1)
您可以在构造函数中设置变量。所以你需要先打电话。例如:
class login extends application{
function __construct(){
parent::__construct();
echo $this->getName();
}
}
如果需要传递变量,必须手动执行:
class login extends application{
function __construct($x){
parent::__construct($x);
echo $this->getName();
}
}
是的,它有点像离合器。如果可以帮助的话,尽量不要覆盖构造函数。此外,尽量避免在构造函数中执行任何繁重的逻辑(如登录到远程服务)。最好随后按需提供。
答案 4 :(得分:1)
必须使用没有设置默认值的每个参数调用父级__constructor
。如果您不想设置某些变量,则必须在父构造函数中设置默认值或重新实现整个代码。