2012-07-27 62 views
0

有太多的子类,如果它们包含'eg' getName()函数并在“超级类”中覆盖它们并且想要为它们中的每一个打印“a”。我怎样才能实现这个?PHP上的相反覆盖问题

<?php 
    class SuperClass{ 
     public function getName(){ 
      echo 'a'; 
     } 
    } 
    class ChildClass extends SuperClass{ 
     public function getName(){ 
      echo 'b'; 
     } 
    } 
    class SecondChildClass extends SuperClass{ 
     public function getName(){ 
      echo 'c'; 
     } 
    } 
$a = new ChildClass(); 
$a->getName(); //prints a 
$b = new SecondChildClass(); 
$b->getName(); //prints a 
?> 
+1

您可以在'getName()'函数中调用父类函数,如:'parent :: getName()'。 – Leri 2012-07-27 13:44:25

+0

我不想为每个子类调用parent :: getName()。 – ActuallyMAB 2012-07-27 13:46:34

+0

在这种情况下,您可以传递可选参数来定义您要调用父函数还是不要。 – Leri 2012-07-27 13:47:51

回答

4

对于您的示例,要正常工作,只需从SuperClass中移除getName()函数即可。如果您仍想每隔一段时间调用一次SuperClass getName,请尝试重载SuperClass getName函数。

的getName($标志)

,如果你想类的超变量这样,你通过它的标志,否则它会调用子类。

<?php 
    class SuperClass{ 
     public function getName($flag){ 
      echo 'a'; 
     } 
    } 
    class ChildClass extends SuperClass{ 
     public function getName(){ 
      echo 'b'; 
     } 
    } 
    class SecondChildClass extends SuperClass{ 
     public function getName(){ 
      echo 'c'; 
     } 
    } 

    $a = new ChildClass(); 
    $a->getName(); //prints b 
    $a->getName(true); //prints a 
    $b = new SecondChildClass(); 
    $b->getName(); //prints c 
    $b->getName(true); //prints a 
?> 
+2

我似乎无法得到这个在PHP 5.4.4中工作:_Strict Standards:ChildClass :: getName()声明应该与...中的SuperClass :: getName($标志)兼容,并且它只是打印' bbcc'。 – 2012-07-27 14:52:37

+0

是的,你是对的!我只是试图得到相同的结果。 – ActuallyMAB 2012-07-27 15:00:31