2017-10-08 1 views
0

나는 Serializable 인터페이스를 학습하고 있습니다. PHP에서 Serializable 인터페이스를 구현할 때 __destruct 메서드가 올바르게 호출 되었습니까?

php.net

이 __destruct()를 호출하거나 메소드 내부 프로그래밍 않는 다른 부작용이 없음을 밝혔다. 제가 감에 따라 두 부분으로 분리하고자

로서 :

1)__destruct()를 직렬화 인터페이스를 구현할 때이 호출되지 않는다. 그러나로 난) ( 방법을 __destructor를 사용할 때 :

class myClass implements Serializable{ 

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

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

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

$obj = new myClass(); 

__destructor 방법은 잘 작동이 간단하게 출력은 다음과 :

Hello world 

2) :를 사용해야하는 경우 __destruct() 메서드를 사용하여 메서드 내부에서 선언해야합니다. 내가 같은 방법 안에 선언 할 때 :

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

그것은으로 다음 파서 오류를 반환 : php.net가 잘못된 문서를 제공하거나 내가 잘못 할 수없는 이유

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

. 제발 누구나 의 설명서에 대해 가르쳐 줄 수의 개념에서 Serializable 인터페이스는 다음 참조 페이지에 있습니까?

참조 링크 http://php.net/manual/en/class.serializable.php.

+2

왜 공개 기능에 공개 기능이 있습니까? 그냥 호기심 – Akintunde007

+4

Ohk, 그것을 얻었지만 php.net이 그 방법을 선언한다고 말한 이유는 무엇입니까? 참조 링크를 참조하십시오 ... –

+0

@MummyDaddy이 문서는'unserialize()'메소드 안에'__destruct()'메쏘드를 선언해야한다고 말하지는 않습니다. – Progman

답변

2

Serializable 인터페이스를 구현하는 것은 __destruct() 메서드와 아무 관련이 없습니다. serialize() 메서드는 객체를 문자열로 저장하는 데 사용되며 파일에 저장할 수 있습니다 (예 : 세션 시스템 do). 이 단계는 __destruct() 메서드를 트리거하지 않습니다. 개체가 여전히 존재하며 해당 개체에 대한 변수 참조가있을 가능성이 높기 때문입니다.

첫 번째 경우 __destruct() 메서드는 모든 serialization 단계에서 호출되지 않습니다. 사실, 객체를 직렬화하지도 않습니다. 그러나 스크립트가 끝났기 때문에 소멸자가 호출되고 모든 객체가 삭제됩니다.

두 번째 경우에는 메서드 내에 메서드를 선언 할 수 없으므로 질문에 오류 메시지가 나타납니다. serialize() 방법을 사용 중이고 원하는 경우 __destruct()으로 전화 할 수 있습니다. 그렇지 않을 수도 있습니다. 그러나 Serializable 인터페이스와 관련하여 __destruct() 방법은 부적합합니다.

관련 문제