2012-06-22 2 views
3

PHP의 객체가 세션에 저장되면 $_SESSION, 언제 __destruct 메서드가 호출됩니까? 이 설명서에서 명확한 답을 찾을 수 없었습니다. 그것은 __destruct이 스크립트 실행의 마지막에 자동으로 호출 될 것이라고 말합니다. 따라서 내 기대에 따라 $_SESSION에 관계없이 호출 될 것입니다.

그렇다면이 세션에서 개체에 대한 모든 요청에 ​​대해 __destruct이 호출 될 가능성이 있습니까?

: 개체가 __destruct 이전이나 이후에 serialize 되나요? __destruct의 수정 사항이 다음 요청에 반영됩니까?

답변

3

실제로 개체를 세션에 저장하지 않고 문자열로 직렬화하여 저장합니다. 그런 다음 객체의 마법 __sleep__wakeup 메서드를 무시할 수 있습니다. 객체가 직렬화 될 때 __sleep이 호출되고 객체를 직렬화 해제하려고하면 __wakeup이 호출됩니다. 더 많은 정보를 들어

은 다음을 참조하십시오

Manual Documentation for __sleep and __wakeup

Manual Documentation for Storing Serialized Objects in Session

+0

알고 계시다면, __destruct가 호출되기 전이나 후에 직렬화 된 객체입니까? – Chris

+0

개체가 직렬화되지 않고 자동으로 세션에 저장됩니다. '$ _SESSION [ 'index'] = serialize ($ obj);'아마도'__destruct' 메서드가 호출되기 전에이 작업을 수행해야합니다. –

+0

내가 수집 할 수 있었던 것부터, 객체는'__destruct'가 호출되기 전에 직렬화됩니다. 그래서'__sleep'과'__wakeup'을 사용하는 것이 핵심입니다.메모에서, 문서에서'__wakeup'은'__sleep'처럼 속성 목록을 반환 할 필요가없는 것처럼 보입니다. 부모 클래스를 사용하여 기본 기능을 래핑하기 때문에 필자의 경우 중요합니다. 각 하위 클래스에 어떤 속성이 필요한지 알 수있는 좋은 방법이 없습니다. – Chris

0

__construct__destruct는 스크립트가 개체의 인스턴스로 실행 때마다 호출된다. 세션에 오브젝트를 넣으면 해당 오브젝트는 페이지 뷰에서 동일한 값을 보유하지 않으며 단순히 오브젝트 일뿐입니다. 나는 이것을 보여주기 위해 간단한 예를 썼다 :

class MyClass{ 
    var $myVar=1; 
    function __construct(){ 
     $this->myVar++; 
    } 
    function __destruct(){ 
     echo "destruct"; 
    } 
} 
session_start(); 
$_SESSION['object']=new MyClass; 
echo $_SESSION['object']->myVar; 

이의 출력은 다음과 같습니다

destruct2destruct

이 부분은 조금 루프 나를 던져, 나는 거기에 사람이 희망 내가 틀렸다면 나를 바로 잡을 수있다. __destruct()은 개체가 만들어지고 세션에 넣을 때 파괴되므로 두 번 호출됩니다. $_SESSION['object']->myVar을 에코하여 개체를 다시 초기화 한 다음 나중에 삭제합니다. 객체가 호출로 2destruct

다시, 오브젝트가 파괴되고 : 당신은 당신의 코드를 수정하고 $_SESSION['object']=new MyClass;을 꺼내하고 스크립트를 다시 실행하면

, 그것은 생산합니다 함수는 실행을 완료합니다. 기본적으로 개체를 세션에 저장하는 경우 개체에 액세스 할 때마다 개체가 파괴 될 것으로 예상됩니다.

관련 문제