我試圖使用spl_autoload_register
,我想創建一個if()
語句,將檢查類的方法已經被註冊。如何檢查SPL堆棧中是否存在函數?
例如:
if (spl_autoload_function(array($this, '_loadClass'))
// Then do nothing
else
// Then run spl_autoload_register(array($this, '_loadClass));
是像上面的代碼/方法可能?
我試圖使用spl_autoload_register
,我想創建一個if()
語句,將檢查類的方法已經被註冊。如何檢查SPL堆棧中是否存在函數?
例如:
if (spl_autoload_function(array($this, '_loadClass'))
// Then do nothing
else
// Then run spl_autoload_register(array($this, '_loadClass));
是像上面的代碼/方法可能?
我想做一個自動加載器,我想創建一個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');
這就是說,你爲什麼寫自己的自動加載磁帶機?那裏已經有很多了,很難相信它們都不符合你的要求。
學習經驗,我們不能通過使用其他人的代碼來完善我們的PHP技能=) – Eli 2012-02-27 08:46:47
公平不夠,學習對於這個問題其實是一個非常有效的答案:) – 2012-02-27 08:50:45
聲明:我不完全有信心我明白你的問題,但我有足夠的信心我想我會試着回答。
沒有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
簡單地檢查它是否存在。
也許這樣?如果(定義(「富」)){ ... } – Edig 2012-02-27 07:05:59
我想定義是有關定義,而不是類嗯,但我想真正檢查功能已被定義,如果其在SPL堆棧沒有。 – Eli 2012-02-27 07:08:27
和閃光它可以在類的內部或外部的,如果它的工作負載=真 – Edig 2012-02-27 07:09:53