1

嗨,我正在尝试编写代码来实现 php 多态性。不知道代码哪里出错了。它在“致命错误:无法重新声明 Sample::a()”中显示错误。这是我的代码。请解决这个问题。

 <?php
 class Sample
{
public function a()
{
 echo "hi";
}
public function a($chr)
{
 for ($chr=0;$chr<10;$chr++)
 echo $chr;
}
 public function a($b,$c)
 {
for($g=$b;$g<$c;$g++)
echo $g
}
}

$s=new Sample();
$s->a();
$s->a($chr);
$s->a(1,10);
?>  
4

4 回答 4

5

PHP 不支持方法重载……很遗憾!

有一些时髦的方法可以实现一些感觉像是重载的东西,比如使用魔法方法或包装子方法调用。这些甚至都没有接近真实的东西。

于 2012-11-29T10:07:11.187 回答
2

这不是多态性,而是以下内容:

class A {
    public function foo() {
        return 1;
    }
}

class B {
    public function foo() {
        return 2;
    }
}

$items = array(new A(), new B());

echo $items[0]->foo();
echo $items[1]->foo();
于 2012-11-29T10:10:44.863 回答
0

http://www.php.net/manual/en/language.oop5.overloading.php

请参阅上面的链接。我想它会对你有所帮助。

于 2012-11-29T10:14:15.463 回答
0

PHP 不支持您要求的方法重载。

您可以获得的最接近的是使用动态参数来伪造它。类似于以下内容:

class dynamic {
    public function example() {
        $args = func_get_args();
        switch(count($args)) {
            case 1 : return $this->example_1arg($args[0]);
            case 2 : return $this->example_2args($args[0],$args[1]);
            //etc..
        }
    }
    private function example_1arg($arg1) {
        //....
    }
    private function example_2args($arg1,$arg2) {
        //....
    }
}

这仍然不能让你正确地重载方法,因为这个例子没有考虑数据类型。您可以在一定程度上使用instanceof将其连接起来,但您将无法全程使用,因为 PHP 也不(尚)支持原始类型的类型提示。

于 2012-11-29T10:17:20.587 回答