我可以在PHP中重载方法吗?

时间:2009-12-31 12:09:07

标签: php oop

示例:

我想拥有两个不同的构造函数,我不想使用func_get_arg(),因为它是不可见的args是可能的。

写下其中两个是合法的,例如:

class MyClass {
    public function __construct() {
    // do something
    }
    public function __construct(array $arg) {
    // do something
    }
}

6 个答案:

答案 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()创建伪重载函数,但这可能会导致方法/函数的界面混乱。