2017-02-03 56 views
1

我收到一個PHP錯誤,指出某個特定的類未定義(當我引用成員方法時),並且在某些情況下沒有定義。所以我創建了一個IF語句來首先檢查這個類是否存在,然後檢查它的方法是否存在。現在我的IF語句正在產生錯誤。這裏的IF語句:class_exists未能檢測到未定義的類

$visitordataavailable = ((isset($_SESSION['VISITOR'])) && (class_exists("Visitor",false)) && method_exists($_SESSION['VISITOR'],'toArray')); 

而這裏的錯誤:

Fatal error: method_exists(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "Visitor" of the object you are trying to operate on was loaded before unserialize() gets called or provide a __autoload() function to load the class definition in...

怎麼會這樣產生錯誤!? class_exists返回true,表示「Visitor」類存在,但method_exists崩潰,因爲類「Visitor」未定義。是一個「定義」類與「存在」類不同嗎?

我在這裏做錯了什麼?

+0

Myabe類免除定義存在,但你reallay有它的一個實例在'$ _SESSION [「訪問者」]'?有類'__wakeup()__sleep()'?更好地做一個額外的'is_object($ _ SESSION [ '訪問者'])'檢查 – JustOnUnderMillions

+0

'class_exists()'返回true,如果PHP可以找到類(包括/需要,使用自動裝載等)。它沒有告訴你有關會話變量中當前狀態的任何信息。 –

+0

JustOnUnderMillions:is_object按我希望的方式工作!你能解釋一個變量如何保存一個對象,PHP能夠識別該對象存在的類,但is_object是錯誤的嗎? – TSG

回答

0

您需要要麼實例化類和對象傳遞給method_exists,或使用is_callable和傳遞包含類名和方法名稱的數組。您必須在類名中包含任何名稱空間。因此,嘗試

isset($_SESSION['VISITOR']) && class_exists("Visitor",false) 
    && is_callable(array('Namespace\Here\'.$_SESSION['VISITOR'],'toArray')) 

如果沒有命名空間只使用

isset($_SESSION['VISITOR']) && class_exists("Visitor",false) 
     && is_callable(array($_SESSION['VISITOR'],'toArray')); 

編輯: 思考它,你也許可以用class_exists作爲其隱含的is_callable檢查