[英]How can I have over loaded constructor in Php5?
我有两个构造函数:
function clsUsagerEmailUserName($nickName, $email)
{
$this->nickName = $nickName;
$this->email = $email;
}
function clsUsagerEmailUserName($email)
{
$this->email = $email;
}
但这行不通吗? 怎么了,在此版本的PHP中不应该是OO吗? (我只是从PHP4迁移)
如果您有充分的理由要按此顺序保留函数参数,请执行以下操作:
function __construct()
{
switch ( func_num_args() ) {
case 1:
$this->email = func_get_arg(0);
break;
case 2:
$this->nickName = func_get_arg(0);
$this->email = func_get_arg(1);
break;
// [...]
default:
throw new Exception('Wrong number of values passed to constructor');
}
}
不过,我强烈建议Daok给出答案。
PHP5不允许重载构造函数。
或者,您可以使用函数进行设置,也可以使用以下技巧(在EE上找到):
function __construct ($var1, $var2 = null)
{
if (isset($var2))
{
//Do one thing
}
else
{
//Do another
}
}
PHP在较新的版本中支持面向对象的构造,但是函数重载不是面向对象范例的一部分。
正如其他人已经说过的那样,PHP不支持重载函数。 在PHP中,您可以为函数参数定义“默认值”。 您的函数可能看起来像这样,具有预期的行为:
function clsUsagerEmailUserName($nickName, $email = NULL)
{
if ($email <> NULL)
{
$this->nickName = $nickName;
$this->email = $eMail;
}
else
{
$this->email = $nickName;
}
}
请注意上面示例中与变量名的混淆! 在PHP中更好地使用此“功能”看起来像这样,但是您需要更新应用程序中的每个函数调用:
function clsUsagerEmailUserName($email, $nickName = NULL)
{
$this->email = $email;
if ($nickName <> NULL)
$this->nickName = $nickName;
}
为了清洁,我更喜欢第二个。
您可以使用func_get_args计算传递的参数数量,然后将其与方法匹配。
abstract class AlmostPolymorphicObject {
public function __construct() {
$args = func_get_args();
$argsCount = count($args);
$callback = array($this, '_construct'.$argsCount);
if (!is_callable($callback)) {
throw new Exception('no valid constructor for param count '.$argsCount);
}
return call_user_func_array($callback, $args);
}
}
class FooBar extends AlmostPolymorphicObject {
private function _construct0() {
}
private function _construct1($var1) {
}
private function _construct2($var1, $var2) {
}
}
$var = new FooBar(); // would run _construct0
$var = new FooBar('var'); // would run _construct1
$var = new FooBar('var','var'); // would run _construct2
$var = new FooBar('var','var', 'asdasd'); // would throw error 'no valid constructor for param count 3'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.