PHP中有任何多态性吗?

时间:2011-04-10 03:08:10

标签: php oop polymorphism

假设baseson类都有方法method_1

还有method_2的另一种base方法。

base::method_2内,无论$this->method_1base::method_1还是$this的实例,我如何将base指向son?< / p>

5 个答案:

答案 0 :(得分:1)

如果我理解正确,你需要这样的东西:

<?php

class base {
  public function method1() {
    echo "base:method1\n";
  }
  public function method2() {
    if(get_class($this) == 'base') {
      $this->method1();
    }
    else {
      parent::method1();
    }
    echo "base:method2\n";
  }
}



class son extends base {
  public function method1() {
    echo "son:method1\n";
  }
}


$obj = new son();

$obj->method2();

其中对method2的调用将始终使用method1的基本版本。

我能做到的最好的方法如上所述,但是这个代码不起作用,因为base没有父代。我很确定你想做的事情是不可能的。

这是你会得到的错误:

PHP Fatal error:  Cannot access parent:: when current class scope has no parent in 

答案 1 :(得分:1)

这将做你想要的。代码示例代码的道具(即使他没有完成工作)。

<?php

class base {
  public function method1() {
    echo "base::method1\n";
  }
  public function method2() {
    if (get_parent_class($this) === FALSE) {
      echo get_class($this)." has no parent\n";
      $this->method1();
    } else {
      echo get_class($this)." has parent\n";
      call_user_func(array(get_parent_class($this), 'method1'));
    }
  }
}

class son extends base {
  public function method1() {
    echo "son::method1\n";
  }
}

$b = new base();
$b->method2();

$s = new son();
$s->method2();

?>

输出:

base has no parent
base::method1
son has parent
base::method1

答案 2 :(得分:0)

将该功能设为私有:

<?php
class A
{
  public function __construct()
  {
    $this->foo();
    $this->bar();    
  }

  private function foo() { echo "A::foo()\n"; }
  public function bar() { echo "A::bar()\n"; }
}

class B extends A
{
  public function foo() { echo "B::foo()\n"; }
  public function bar() { echo "B::bar()\n"; }
}

new B();
?>

输出结果为:

A::foo()
B::bar()

答案 3 :(得分:0)

是的。这是单数(一个父母)。

son->method_1可以添加或覆盖所有base->method_1功能。

son->method_1可以简单地添加一个额外的功能,并利用它的父实例method_1的其余功能

所以调用$this->method_1会使用base->method_1son->method_1,只要你想在base中使用的内容不会在子代中被覆盖。

答案 4 :(得分:0)

如果调用子类中不存在的方法,PHP将遍历类层次结构,直到找到实现所需函数的祖先类。这意味着如果您的son类没有实现method_2,PHP将自动查找最近的祖先。{在您的情况下,它会根据您的需要调用method_2 base

如果您 覆盖了method_2课程中的son,并且您想要自己实施method_2 ,并且还要调用base::method_2实施然后您可以使用parent关键字:

class son extends base {
  public function method_2() {
    parent::method_2();
    //do son::method_2()-specific stuff here
  }
}

您无法将parent个调用链接在一起,因此如果baseGrandparentClass的子类,则您无法执行以下操作:

parent::parent::method_2(); // trying to call grandparent::method_2
                            // but this call will fail

但是你可以按名称直接引用祖先类,所以这可以工作:

GrandparentClass::method_2();

只是为了更进一步,还有一个名为class_parents()的函数,它返回一个类继承的每个祖先类的数组。如果你想回去,比如说两个祖先,但由于某些原因你不知道它的具体名称,你可以使用eval()调用该函数。

例如,此代码将调用GrandparentClass::method_2()而不直接在代码中引用类名称:

$parents = class_parents($this);
eval(end($parents) . "::method_2();");

希望有所帮助。