rt
abstract class Node {
private $debugMessages;

public function __construct() {
$this->debugMessages = array();
$this->debug(__CLASS__.' constructor called.');
}

public function __destruct() {
$this->debug(__CLASS__.' destructor called.');
$this->dumpDebug();
}

protected function debug($msg) {
$this->debugMessages[] = $msg;
}

private function dumpDebug() {
echo implode('<br />', $this->debugMessages);
}

public abstract function getView();
}


class ForumTopic extends Node {
private $debugMessages;

public function __construct() {
parent::__construct();
$this->debug(__CLASS__.' constructor called.');
}

public function __destruct() {
$this->debug(__CLASS__.' destructor called.');
parent::__destruct();
}

public function getView() {
return 'This is a view into '.__CLASS__.'<br />';
}
}

$forum = new ForumTopic();
echo $forum->getView();
执行结果:
This is a view into ForumTopic
Node constructor called.
ForumTopic constructor called.
ForumTopic destructor called.
Node destructor called.但没有new ForumTopic()怎么能够调用执行getView()?phpdestructorconstructorfunctionclass

解决方案 »

  1.   

    还有请问__CLASS__与get_class()有什么本质的区别?好像其中一个总是指向一个类,而另一个则根据类的域不同而指向不同的类,具体我记不清楚了
      

  2.   

    执行顺序:
    ForumTopic::__construct()
    Node::__construct()
    Node::debug()
    ForumTopic::debug()
    ForumTopic::getView()
    ForumTopic::__destruct()
    ForumTopic::debug()
    Node::__destruct()
    Node::debug()
    Node::dumpDebug()
      

  3.   

    不知道你想说啥,哪个先调用就执行哪个。
    你是先执行echo $forum->getView();所以先输出:This is a view into ForumTopic
    在对象的销毁的时候,父类析构函数把$debugMessages中的所有数据打印出来了。就下面那样:
    Node constructor called.
    ForumTopic constructor called.
    ForumTopic destructor called.
    Node destructor called.
    __CLASS__指是的当前类get_class($obj)指的是实例$obj的类
      

  4.   

    如果你把
    protected function debug($msg) {
                $this->debugMessages[] = $msg;
            }
    改成
    protected function debug($msg) {
               echo $msg;
            }
    你就可以看到真正的执行顺序
      

  5.   

    一个是函数,一个是变量。get_class()需要对象参数。你写的例子是重载了。“但没有new ForumTopic()怎么能够调用执行getView()? ”你这句话没弄懂,怎么跟你的例子有点矛盾
      

  6.   


    LZ的意思是不是不要创建实例,直接调用getView方法。如果是就用类名::方法名。
    ForumTopic::getView()
      

  7.   

    我明白了!我原以为按照代码顺序最后才输出getView(),原来__destruct()执行才正式输出内容,所以getView()变成第一个输出了谢谢各位啊。。