2017-10-08 15 views
0

J'apprends à Serializable interface.La méthode __destruct est appelée correctement lors de l'implémentation de l'interface Serializable dans PHP?

php.net a déclaré que

Cela n'invoque __destruct() ou avoir tout autre effet secondaire à moins programmé à l'intérieur du procédé.

qui je voudrais séparer en deux parties selon mon sens que:

1):__destruct() est pas appelé lors de la mise en oeuvre du Serialisable l'interface. Mais quand je l'utilise __destructor() Méthode comme:

class myClass implements Serializable{ 

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

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

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

$obj = new myClass(); 

Le __destructor méthode fonctionne très bien et cela simplement génèrerait les éléments suivants:

Hello world 

2): Si vous devez utiliser __destruct() méthode que vous devez déclarer à l'intérieur de la méthode. Mais quand je déclare dans la méthode comme:

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(); 

Il renvoie l'erreur d'analyse suivant comme:

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

Pourquoi php.net fournit des documents faux ou peut-être je me trompe. S'il vous plaît quelqu'un peut-il m'apprendre sur la documentation de __constructor() et __destructor() dans le concept de Serializable interface sur la page de référence suivante?

Lien de référence http://php.net/manual/en/class.serializable.php.

+2

Pourquoi avez-vous une fonction publique dans une fonction publique? Juste curieux – Akintunde007

+4

Ohk l'a eu, mais pourquoi php.net dit que déclarer à l'intérieur de la méthode. voir le lien de référence ... –

+0

@MummyDaddy La documentation ne dit pas que vous devez déclarer la méthode '__destruct()' dans votre méthode 'unserialize()' (et vous ne pouvez pas voir le message d'erreur). – Progman

Répondre

2

La mise en œuvre de l'interface Serializable n'a rien à voir avec la méthode __destruct(). La méthode serialize() est utilisée pour enregistrer l'objet sous forme de chaîne, qui peut être enregistrée dans un fichier (comme le système de session). Cette étape ne déclenche pas la méthode __destruct() car l'objet existe toujours et il existe probablement une référence variable à cet objet.

Dans votre premier cas, la méthode __destruct() n'est appelée par aucune étape de sérialisation. En fait, vous ne même pas sérialiser votre objet. Cependant, votre destructeur est appelé car votre script s'est arrêté et tous les objets vont être supprimés.

Dans votre deuxième cas, vous ne pouvez pas déclarer les méthodes dans les méthodes, vous obtenez le message d'erreur dans votre question. Lorsque vous êtes dans votre méthode serialize(), vous pouvez appeler __destruct() si vous voulez ... ou non. Mais en ce qui concerne l'interface Serializable la méthode __destruct() est sans importance.