2015-10-16 153 views
3

我創建的自動加載類的簡單腳本,但是當我使用class_exists執行spl_autoload_register,例如:class_exists呼籲spl_autoload_register

<?php 
function autoLoadClass($name) { 
    echo 'spl_autoload_register: ', $name, '<br>'; 
} 

spl_autoload_register('autoLoadClass'); 

class_exists('Foo'); 
class_exists('Bar'); 
class_exists('Foo\\Bar'); 

輸出:

spl_autoload_register:富
spl_autoload_register: Bar
spl_autoload_register:Foo \ Bar

是嗎?有沒有辦法讓「spl_autoload」忽略調用「class_exists」?

+3

你有一個關於'class_exists'問題,爲什麼你不擡頭看手冊吧? – Rizier123

+1

@ Rizier123感謝*阻止*。 –

+0

我的評論不應該阻止你。如果您對特定功能有疑問或問題,應該多提一些提醒/信息來檢查手冊。 – Rizier123

回答

8

您可以使class_exists不會調用自動加載。
the manual

布爾class_exists(字符串$ CLASS_NAME [,布爾$自動加載=真]

所以一個電話,如:

class_exists('Foo', false);

會忽略自動加載。

[Demo]

可能使自動加載功能忽略使用debug_backtrace由(AB)從class_exists呼叫,但該方法是難看和很慢,但爲了完整起見,這裏是如何做到這一點:

function autoLoadClass($name) { 
    foreach(debug_backtrace() as $call) { 
     if(!array_key_exists('type', $call) && $call['function'] == 'class_exists') { 
      return; 
     } 
    } 
    echo 'spl_autoload_register: ', $name, '<br>'; 
} 

(注:這似乎並不在HHVM工作)

如果其中一個調用函數被調用class_exists,並且$call['type']必須不存在以確保類似SomeClass::class_exists$someObject->class_exists的調用被過濾掉,則基本上會中止該函數。

[Demo]

+0

'debug_backtrace'的好例子:)謝謝 - 但'class_exists(...,false);'這就夠了。不過這是一個很好的例子。謝謝你的鼓勵,並提供一個很好的答案,不像其他用戶。 –