2017-10-08 1 views
0

Ich lerne zu Serializable Schnittstelle.__Destruct-Methode wird korrekt beim Implementieren von Serializable-Schnittstelle in PHP aufgerufen?

php.net angegeben, dass

Dies ruft nicht __destruct() oder andere Nebenwirkungen haben, wenn innerhalb des Verfahrens programmiert.

, die ich nach meinem Sinn in zwei Teile trennen möchte als:

1):__destruct() wird nicht aufgerufen, wenn die Serializable Schnittstelle implementiert. Aber wenn ich __destructor() Methode wie:

class myClass implements Serializable{ 

    public function serialize(){ 
     return 'I am serialized'; 
    } 

    public function unserialize($serialized){ 
     //-- 
    } 

    public function __destruct(){ 
     echo "Hello world"; 
    } 
} 

$obj = new myClass(); 

Die __destructor Methode funktioniert gut, und dies einfach Ausgabe der folgende:

Hello world 

2): Wenn Sie verwenden müssen __destruct() Methode müssen Sie innerhalb der Methode deklarieren. Aber wenn ich in der Methode deklarieren:

class myClass implements Serializable{ 

    public function serialize(){ 
     return 'I am serialized'; 
    } 

    public function cutomDest(){ 

     public function __destruct(){ 
      echo "Hello world"; 
     } 

    } 

    public function unserialize($serialized){ 
     //-- 
    } 
} 

$obj = new myClass(); 

Es gibt den folgenden Parserfehler als:

Parse error: syntax error, unexpected 'public' (T_PUBLIC) in ..... 

Warum php.net falsche Dokumentation enthält, oder kann ich falsch bin. Bitte kann mir jemand über die Dokumentation von __constructor() und __destructor() im Konzept von Serializable Schnittstelle auf der folgenden Referenzseite?

Referenznummer http://php.net/manual/en/class.serializable.php.

+2

Warum haben Sie eine öffentliche Funktion in einer öffentlichen Funktion? Nur neugierig – Akintunde007

+4

Ohk hat es, aber warum php.net sagt, dass innerhalb der Methode deklarieren. siehe den Verweis Link ... –

+0

@MummyDaddy Die Dokumentation sagt nicht, dass Sie die '__destruct()' Methode innerhalb Ihrer 'unserialize() 'Methode deklarieren müssen (und Sie können nicht wie von der Fehlermeldung gesehen). – Progman

Antwort

2

Die Implementierung der Schnittstelle Serializable hat nichts mit der Methode __destruct() zu tun. Die Methode wird verwendet, um das Objekt als Zeichenfolge zu speichern, die in einer Datei gespeichert werden kann (wie beim Session-System). Dieser Schritt löst die Methode __destruct() nicht aus, da das Objekt noch vorhanden ist und höchstwahrscheinlich eine Variablenreferenz für dieses Objekt vorhanden ist. In Ihrem ersten Fall wird die Methode __destruct() von keinem Serialisierungsschritt aufgerufen. Tatsächlich serialisieren Sie Ihr Objekt nicht einmal. Ihr Destruktor wird jedoch aufgerufen, weil Ihr Skript beendet wurde und alle Objekte gelöscht werden.

In Ihrem zweiten Fall können Sie keine Methoden in Methoden deklarieren, Sie erhalten die Fehlermeldung in Ihrer Frage. Wenn Sie in Ihrer serialize() Methode sind, können Sie __destruct() aufrufen, wenn Sie wollen ... oder nicht. Aber in Bezug auf die Schnittstelle Serializable ist die __destruct() Methode irrelevant.

Verwandte Themen