我有一个qeustion。我有一些oop的经验,但我是PHP(oop)的新手。我正在努力学习它。可能吗 重载一个consturctor?
在其他语言中,它可能会重载构造函数,但在php中没有? 我尝试了但是我从IDE获得了以下消息: "具有相同名称的方法在本课程中已经有所不同"
class testClass{
public $param1 = "";
public $param2 = "";
public function __construct($param1, $param2){
$this->param1 = $param1;
$this->param2 = $param2;
}
public function __construct($param1){
$this->param1 = $param1;
//ToDO use function to set pramam2
}
}
答案 0 :(得分:3)
执行此操作的最佳方法是使用可选参数,正如其他人在评论中所说,PHP不支持重载,所以这将是我的建议:
class Foo
{
public function __construct($p1, $p2 = null)
{
$this->p1 = $p1;
$this->p2 = $p2;
}
}
这意味着您可以在创建课程时选择使用$p2
,但必须使用$p1
。
AFAIK,这是重载的唯一形式(如果你可以称之为),它还存在于PHP中
修改强>
来自kingkero的回答的扩展,我提出了这个解决方案,它将逻辑排除在构造函数之外,减去函数调用:
<?php
class overload
{
public function __construct()
{
return $this->switchConstruct(func_get_args());
}
protected function switchConstruct(array $args)
{
switch (count($args))
{
case 0:
return print "0 params<br />";
case 1:
return call_user_func_array(array($this, 'constr1'), $args);
case 2:
return call_user_func_array(array($this, 'constr2'), $args);
}
die("Invalid number of args");
}
protected function constr1($a)
{
print "constr1 called<br />";
}
protected function constr2($a, $b)
{
print "constr2 called<br />";
}
}
答案 1 :(得分:2)
不,你不能重载这样的方法。
您可以做的最好的事情是使用可选参数:
class testClass{
public $param1 = "";
public $param2 = "";
public function __construct($param1, $param2=null){
$this->param1 = $param1;
if($param2){
$this->param2 = $param2;
}else{
//ToDO use function to set pramam2
}
}
}
答案 2 :(得分:1)
如前所述,你不能这样做。但是,如果您希望它比给定的答案更具可变性,请尝试将func_get_args()
与call_user_func_array()
结合使用(demo)
class Foo {
public function __construct() {
$args = func_get_args();
switch (count($args)) {
case 2:
return call_user_func_array(
array($this, 'constructorFor2Arguments'),
$args
);
//...
}
}
protected function constructorFor2Arguments($one, $two) {
//...
}
}