2012-02-27 80 views
2

我試圖使用spl_autoload_register,我想創建一個if()語句,將檢查類的方法已經被註冊。如何檢查SPL堆棧中是否存在函數?

例如:

if (spl_autoload_function(array($this, '_loadClass')) 
    // Then do nothing 
else 
    // Then run spl_autoload_register(array($this, '_loadClass)); 

是像上面的代碼/方法可能?

+0

也許這樣?如果(定義(「富」)){ ... } – Edig 2012-02-27 07:05:59

+0

我想定義是有關定義,而不是類嗯,但我想真正檢查功能已被定義,如果其在SPL堆棧沒有。 – Eli 2012-02-27 07:08:27

+0

和閃光它可以在類的內部或外部的,如果它的工作負載=真 – Edig 2012-02-27 07:09:53

回答

2

我想做一個自動加載器,我想創建一個if語句來檢查類方法是否已經被註冊。

你不應該。沒有必要做if語句; spl_autoload_register會忽略使用相同的參數第二個電話:

<?php 

$foo = function($class) { 
    return false; 
}; 

spl_autoload_register($foo); 
var_dump(spl_autoload_functions()); 

spl_autoload_register($foo); 
var_dump(spl_autoload_functions()); 

輸出顯示,雖然我們叫spl_autoload_register兩次,仍然只是一個自動加載;

array(1) { 
    [0]=> 
    object(Closure)#1 (1) { 
    ["parameter"]=> 
    array(1) { 
     ["$class"]=> 
     string(10) "<required>" 
    } 
    } 
} 
array(1) { 
    [0]=> 
    object(Closure)#1 (1) { 
    ["parameter"]=> 
    array(1) { 
     ["$class"]=> 
     string(10) "<required>" 
    } 
    } 
} 

如果你想確保一個類沒有註冊自己兩次,你當然可以設置在某種靜態成員的;

<?php 
class Foo { 
    protected static $registered = false; 

    public function register() { 
     if(self::$registered !== false) { 
      return; 
     } 
     echo "spl_autoload_register(\$this, '_loadClass');\n"; 
     self::$registered = true; 
    } 
} 

$foo = new Foo(); 
$foo->register(); 

$bar = new Foo(); 
$bar->register(); 

輸出顯然是一個行:

spl_autoload_register($this, '_loadClass'); 

這就是說,你爲什麼寫自己的自動加載磁帶機?那裏已經有很多了,很難相信它們都不符合你的要求。

+0

學習經驗,我們不能通過使用其他人的代碼來完善我們的PHP技能=) – Eli 2012-02-27 08:46:47

+0

公平不夠,學習對於這個問題其實是一個非常有效的答案:) – 2012-02-27 08:50:45

0

聲明:我不完全有信心我明白你的問題,但我有足夠的信心我想我會試着回答。


沒有spl_*函數來做到這一點。最接近的是spl_autoload_functions(),它返回spl用來加載的函數,而不是加載的函數。

解決方案:

自己寫的程序的時候,一個函數/類已加載的記錄,並與spl_autoload_register註冊。


要回答評論:如果您有加載函數的類,有它添加到它已經加載的類的內部數組。

class Autoloader { 

    protected $loaded = array(); 

    function autoload($class) { 
     // find class location 
     // if it is found: 
     // include class 
     $this->loaded[] = $class; 
    } 

    function hasLoaded($class) { 
     return in_array($class, $this->loaded); 
    } 

} 

$autoloader = new Autoloader(); 
spl_autoload_register(array($autloader, 'autoload')); 

如果你不小心知道,如果它是由自動加載,可以使用class_exists簡單地檢查它是否存在。

+0

我已加載我的班級自動加載磁帶機,但我要檢查,如果一個類被加載與否。通過這樣做我已經使用spl_autoload_register已經 – Eli 2012-02-27 07:46:34

+0

hmmm,如果我在內部使用'spl_autoload_register',如果我指定'class_exists(__ CLASS __)',這會影響自動加載過程嗎? – Eli 2012-02-27 07:57:40

+0

使用'class_exists'不會觸發自動加載器。 – 2012-02-27 08:00:19

相關問題