2017-03-24 5 views
0

Ich versuche PHP Objected Oriented Programmierung zu lernen, aber während des Video-Tutorials erhalte ich einen Fehler, während der Tutorial-Moderator nicht das gleiche Problem hat!PHP __toString() Funktioniert nicht richtig?

PHP-Code:

<?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; 


?> 

ich folgende Fehler bekommen:

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 

Wenn ich echo-return ändern bekomme ich folgende Ausgabe, die nicht passieren sollte, da ich nicht bin unsetting das Objekt. Warum sollte die __destruct() Funktion aufgerufen werden, wenn echo zu return in toString() geändert wird?

Der Fehler wird:

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

Sie sollten 'return' anstelle von' echo' in Ihrer '__toString()' Methode verwenden. – Raptor

+0

@Raptor: Ja genau, wenn ich 'return' benutze, dann wird das' __destruct() 'auch zu Echo gerufen ??? Bitte lesen Sie die Frage richtig. –

+2

Es ist ein ** normales ** Verhalten, dass Destructor aufgerufen wird, da das Objekt bei der Ausführung des Skripts durch Garbage-Collection erfasst wird. – Raptor

Antwort

5

Sie müssen return-Anweisung hinzuzufügen.

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

Ihr Skript endet am Ende dieser Datei, deshalb wird destructor aufgerufen!

+0

Bitte lesen Sie meine Frage richtig! : D –

+2

Diese Antwort gilt immer noch nach dem Lesen Ihrer Frage richtig :) –

+1

Ich habe es richtig gelesen, und ich lese es gerade wieder .... sehe nichts falsch mit der Antwort ... versuchen, Schlafanweisung nach hinzuzufügen echo Ihr Objekt ... Sie werden sehen, dass es nach der Schlaf-Anweisung zerstört werden wird –

1

Die richtige Antwort ist wie oben:

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

Destruct Methode wird aufgerufen, wenn Sie mit Ihrem Objekt fertig sind. In Ihrem Fall nach:

echo $newPlayer;