PHP の抽象クラスに抽象メソッドがある場合、その抽象メソッドが最初に実行され、次に他のメソッドが実行される必要がありますか?
RT
<br />
abstract class Node {<br />
private $debugMessages;<br />
<br />
public function __construct() {<br />
$this->debugMessages = array();<br />
$this->debug(__CLASS__.' constructor called.');<br />
}<br />
<br />
public function __destruct() {<br />
$this->debug(__CLASS__.' destructor called.');<br />
$this->dumpDebug();<br />
}<br />
<br />
protected function debug($msg) {<br />
$this->debugMessages[] = $msg;<br />
}<br />
<br />
private function dumpDebug() {<br />
echo implode('<br />', $this->debugMessages);<br />
}<br />
<br />
public abstract function getView();<br />
}<br />
<br />
<br />
class ForumTopic extends Node {<br />
private $debugMessages;<br />
<br />
public function __construct() {<br />
parent::__construct();<br />
$this->debug(__CLASS__.' constructor called.');<br />
}<br />
<br />
public function __destruct() {<br />
$this->debug(__CLASS__.' destructor called.');<br />
parent::__destruct();<br />
}<br />
<br />
public function getView() {<br />
return 'This is a view into '.__CLASS__.'<br />';<br />
}<br />
}<br />
<br />
$forum = new ForumTopic();<br />
echo $forum->getView();<br />
ログイン後にコピー
実行結果:
これは ForumTopic
へのビューです
ノード コンストラクターが呼び出されます。
ForumTopic コンストラクターが呼び出されます。
ForumTopic デストラクターが呼び出されました。
ノード デストラクターが呼び出されました。
しかし、new ForumTopic() を使用せずに getView() を呼び出して実行するにはどうすればよいでしょうか?
php
デストラクター
コンストラクター
関数
クラス
-----解決策---------実行順序:
フォーラムトピック::__construct()
ノード::__construct()
Node::debug()
フォーラムトピック::debug()
フォーラムトピック::getView()
フォーラムトピック::__destruct()
フォーラムトピック::debug()
ノード::__destruct()
Node::debug()
Node::dumpDebug()
-----解決策---------わかりませんあなたが望むもの あなたが何を言っても、最初に呼び出された方が実行されます。
最初に echo $forum->getView(); を実行するので、最初に出力します。これは ForumTopic
へのビューです。
オブジェクトが破棄されると、親クラスのデストラクターは $debugMessages 内のすべてのデータを出力します。このようにしてください:
ノード コンストラクターが呼び出されます。
ForumTopic コンストラクターが呼び出されます。
ForumTopic デストラクターが呼び出されました。
ノード デストラクターが呼び出されました。
__CLASS__ は現在のクラスを参照します
get_class($obj) はインスタンス $obj のクラスを参照します
------解決策-------- を入れると
保護された関数のデバッグ($msg) {
$this->debugMessages[] = $msg;
}
に変更します
保護された関数のデバッグ($msg) {
echo $msg;
}
実際の実行シーケンスを確認できます
-----解決策---------
。
1 つは関数、もう 1 つは変数です。 get_class() にはオブジェクト パラメータが必要です。
あなたが書いた例はオーバーロードされています。
「しかし、new ForumTopic() を使わずに getView() を呼び出して実行するにはどうすればよいでしょうか? この文は理解できません。なぜ例と矛盾しているのですか
」