示例:
我想拥有两个不同的构造函数,我不想使用func_get_arg(),因为它是不可见的args是可能的。
写下其中两个是合法的,例如:
class MyClass {
public function __construct() {
// do something
}
public function __construct(array $arg) {
// do something
}
}
答案 0 :(得分:10)
不,但你可以这样做:
class MyClass {
public function __construct($arg = null) {
if(is_array($arg)) {
// do something with the array
} else {
// do something else
}
}
}
在PHP中,函数可以接收任意数量的参数,如果给它们一个默认值,则不必定义它们。这就是你如何“伪造”函数重载并允许访问具有不同参数的函数。
答案 1 :(得分:3)
PHP有一些叫做“重载”的东西(通过__call
魔术方法),但真正发生的是当一个不可访问或不存在的方法时调用魔术方法__call
,而不是像__get
和__set
可让您“访问”无法访问/不存在的属性。您可以使用它来实现非魔法方法的重载,但它不实用。
由于形式参数可以是无类型的(这与参数值的类型不同,因为那些是类型的),甚至函数arity也没有严格执行(每个函数都有最小数量的参数,但没有理论上的最大值),你也可以编写方法体来处理不同数量和类型的参数。
答案 2 :(得分:2)
不,你不能这样做。
答案 3 :(得分:2)
这是不可能的,但是为了解决隐形args的问题,你可以使用reflection class。
if(count($args) == 0)
$obj = new $className;
else {
$r = new ReflectionClass($className);
$obj = $r->newInstanceArgs($args);
}
答案 4 :(得分:0)
由于PHP是弱类型语言并且它支持具有可变数量的参数的函数(所谓的varargs),因此具有相同名称的两个函数之间的处理器没有区别,即使它们具有不同数量的声明参数(所有功能都是varargs)。因此,超载在设计上是非法的。
答案 5 :(得分:0)
您也可以使用func_get_args()创建伪重载函数,但这可能会导致方法/函数的界面混乱。