2014-11-24 8 views
3

PHP에서 본 적이없는 것을 발견했습니다.int의 var_dump가 알려지지 않음 : 0

이 오류 메시지는 다음과 같은 성명을 의미

Fatal error: Unsupported operand types in ... on line 41

:

UNKNOWN:0 
: 내 스크립트에서 작업하기 전에 $this->lastAction을 위해서 var_dump 때

if($this->lastAction + 7200 <= time()) { 
} 

내가 출력을 얻을 내 스크립트가 오류로 중단

전에는 본 적이 없어요. 그리고이 값이 내 변수에 할당 된 위치 나 이것이 일어나는 조건을 상상할 수 없습니다.

이 "가치"가 어디에서 왔는지 힌트 또는 설명이 있습니까?

Object of class stdClass could not be converted to int ... on line 41

하지만 내가 할 수있는 stdClass 인스턴스를 지정하지 :

UPDATE 1

나는 PHP 5.3과 ENV에 같은 설치 프로그램을 실행하면 내가 대신에 오류가 있음을 발견 이 변수.

UPDATE 2

문제가 5.4.28 버전과 동일한 에러 PHP 5.5.19 존재한다.


는 AuthHandler.php

abstract class AuthHandler 
{ 
    protected $lastAction; 

    public function __construct() 
    { 
     $this->lastAction = isset($_SESSION['last_action']) ? $_SESSION['last_action'] : time(); 

     if($this->lastAction + 7200 <= time()) { 
      $this->logout(); 
     } 

     $this->lastAction = time(); 
    } 

    public function logout() 
    { 
     session_destroy(); 
     session_regenerate_id(); 

     $this->lastAction = null; 
    } 

    public function __destruct() 
    { 
     $_SESSION['last_action'] = $this->lastAction; 
    } 
} 

DBAuthHandler.php

class DBAuthHandler extends AuthHandler 
{ 
    // other stuff here 
} 
+0

어떤 유형이'$ this'입니까? –

+0

은 [gettype()] (http://php.net/manual/en/function.gettype.php)을 사용하여'$ this-> lastAction'의 타입을 출력 할 수 있습니까? – Jerodev

+0

당신의 PHP 버전은 무엇입니까? – sectus

답변

0

제공 한 코드는 완벽하게 나를 위해 작동합니다. 반환 된 객체는

object(App\Http\Controllers\DBAuthHandler)#141 (1) { ["lastAction":protected]=> int(1416817485) } 

그래서 문제가 $_SESSION['last_action']을 설정하려고 방법에있을 것입니다.

+0

말했듯이 :이 객체를 사용하는 하나의 스크립트를 제외하고 모든 경우에 작동합니다. 그리고 그것은 OO의 아주 기본적인 사용법이므로 PHP 코어의 버그라고 생각합니다. – TiMESPLiNTER

+0

듣기가 슬프다. 리팩토링과 함께 행운을 빕니다 –

1

글쎄, 이것은 명확한 대답은 아니지만 문제에 대해 밝힐 수 있습니다.

확인 PHP 소스, "알 수없는 유형"gettype function의 기본 경우입니다. var_dump function에도 동일하게 적용됩니다.

그래서, 기본적으로, 변수는 NULL, 부울, 정수, 는, 문자열, 배열, 객체 또는 자원 다음은 있어 두 번하지 않을 때 알 수없는 유형.

나는 포인터가 무효가 될 때 이런 일이 일어나는 것을 보았다. time() 이후

$handle = fopen('file.txt','r'); 
echo gettype($handle); // resource 
fclose($handle); 
echo gettype($handle); // unknown 

은 항상 다음 문제가 $_SESSION['last_action']로 거짓말을한다 (적어도, 그것은해야한다, 또는) 정수를 반환합니다.

여러 가지 방법을 사용하여 $_SESSION을 파괴하더라도 문제를 재현 할 수 없습니다.

$_SESSION['last_action']을 백 트레이스하여 주기적으로 값을 확인하면 도움이 될지도 모릅니다.

+0

네, 지금까지 네 말이 맞아. 같은 시간에 두 개의 클래스 인스턴스가 있었는데, 어떻게 든 위에서 언급 한 세션 변수에 엉망이 생겼습니다. PHP 5.4와 5.5에서 나는이 클래스에'stdClass' 객체를 가지고있었습니다. 결코 세션에 할당되지 않았지만 스크립트 런타임의 어딘가에서 사용되었습니다. PHP 5.3에서 나는이 UNKNOWN : 0을 가졌다. 그래서 그것은 내가 생각하기에 잘못된 메모리를 어떻게 든 해결하는 PHP 버그입니다. 그러나 나는이 문제를 해결하기 위해 한 번에 하나의 클래스 인스턴스 만 가지고 작동하도록했습니다. – TiMESPLiNTER

관련 문제