2017-03-24 17 views
0

私はPHP Objected Oriented Programmingを習得しようとしていますが、ビデオチュートリアルでは、チュートリアルプレゼンターに同じ問題はありませんが、エラーが表示されます。PHP __toString()正しく動作していませんか?

PHPコード

<?php 


class Player { 

public $score = 10; 
public $name = ""; 

public function __construct($score,$name) { 

    $this->score = $score; 
    $this->name = $name; 
} 

public function __destruct() { 

    echo "Object With Name ".$this->name." has been destroyed"; 
} 

public function __toString() { 
    echo "The Object with name ".$this->name." has been echoed</br>"; 
} 

} 


$newPlayer = new Player(50,"Ahmad"); 


echo $newPlayer; 


?> 

私は、次のエラーを取得しています:私は変更

The Object with name Ahmad has been echoed 
Catchable fatal error: Method Player::__toString() must return a string value in D:\xampp\htdocs\php_oop\index.php on line 30 

echoreturnへのI私は設定解除わけではないと起きてはならない以下の出力を得ますオブジェクト。 echoをに変更したときに__destruct()関数が呼び出されるのはなぜですか?toString()

エラーは次のようになります。

The Object with name Ahmad has been echoed 
Object With Name Ahmad has been destroyed 
+2

'__toString()'メソッドで 'echo'の代わりに' return'を使うべきです。 – Raptor

+0

@Raptor:はい私は 'return'を使う時とまったく同じですので、' __destruct() 'getはエコー時にも呼ばれますか?質問を正しく読んでください..! –

+2

デストラクタが呼び出されるのは**通常の**動作です。スクリプトの実行が終了するとオブジェクトがガベージコレクトされるためです。 – Raptor

答えて

5

あなたがreturn文を追加する必要があります。

return "The Object with name ".$this->name." has been echoed</br>"; 

あなたのスクリプトはこのファイルの最後で終わるので、デストラクタが呼び出されます!

+0

私の質問を正しく読んでください...! :D –

+2

あなたの質問を正しく読んだら、この答えはまだ真実です:) –

+1

私は正しく読んだのですが、私はもう一度それを読んでいました....答えに間違いはありません...後にsleep文を追加しようとしましたあなたのオブジェクトをエコーする...それは睡眠の声明の後に破壊されることがわかります –

1

正しい答えは、上記1のようなものです:あなたは、あなたのオブジェクトで行われたときに

return "The Object with name ".$this->name." has been echoed</br>"; 

自爆メソッドが呼び出されます。あなたの場合:

echo $newPlayer; 
関連する問題