示例:
                       class Top {
public function getParents($class = null, $plist = array()) {
$class = $class ? $class : $this;

$parent = get_parent_class($class);
if ($parent) {
$plist[] = $parent;
$plist = self::getParents();  // 可行
         // self::getParents($parent, $plist);  可行
         // $this->getParents();  不可行(进入死循环)
         // $this->getParents($parent, $plist); 可行
}

return $plist;
}
}

class Middle extends Top {}
class Bottom extends Middle {}

$o = new Bottom();
print_r($o->getParents());关于注释那四条,为什么会这样?

解决方案 »

  1.   

    原则上self是静态调用 this是非静态调用
    两种方法是一样的,随意使用
    只是有一点不同
    this不能调用静态内容
    你getParents没参的话,你第四句也错
      

  2.   


    但是getParents不是静态的喔
      

  3.   


    而且现在变得只能getParents有参数才正确,没有参数一律显示错误(找不到网页)
      

  4.   


    但是如果没参是错误的话,那么程序的最后一句时在外部调用getParents时怎么又正确呢?
      

  5.   

    getParents 方法是按继承关系回溯到基类由于有 $class = $class ? $class : $this;
    所以第一次进入时 $class 可以为空,但在方法中递归时,参数 $class 是不能缺少的
    否则总是 $class = $this; 而陷入死循环
      

  6.   


    但是self::getParents();这句可行喔
      

  7.   

    我说的是self 与 this区别
    看这篇文章
    http://www.cnblogs.com/devcjq/articles/2424738.html
    显示找不到网页你的url或是环境有问题了
    另外,死循环了,哪个也不会运行
      

  8.   


    其实是不是当执行到self::getParents();这句时的self::指的是Middle类,所以这也正确的这样子呢?而用$this->的话执行指的是$o代表的那个Bottom类,所以用$this->而没有参数的话就错这样子呢?
      

  9.   

    你看错了吧?真的可行吗?不是死循环吗?
    我怀疑你用的是山寨版的php6
      

  10.   

    哦?!就是说不管用什么调用,没参数都一律是错的是这样子吧另外请问怎么分辨是不是山寨的。。我用的是php5
      

  11.   


    还有我的php5的装了pear后好像没有了一个文件的
      

  12.   


    呃。。现在真的显示不能执行了(无法显示网页),用self::getParents();这句的话之前还可以的奇怪
      

  13.   


    “显示找不到网页你的url或是环境有问题了”
    那么怎么办运行错误的PHP网页时才会说找不到网页,正确的就正确显示。。以前运行错误的PHP网页时也没有说找不到网页的,而是一片空白的
      

  14.   

    是的,原因我已经讲过了如果你的php版本高于 www.php.net 相应的系列,那么就一定是山寨的了
      

  15.   


    但我的php安装后就命名为“php5”,至于版本是多少就不知道了
      

  16.   


    咦?!我看到了我的不是山寨的喔。“php-5.2.17-Win32-VC6-x86”不高过5.4的