2012-02-15 60 views
1

我試圖用一個循環動態加載庫,然後將它們添加到$this,我試圖用instanceof來看看試圖再次啓動之前,如果它已經開始了:變量字符串被忽略

$libraries = array('strings'); 
    foreach ($libraries as $lib) { 
     require_once('lib/'.$lib.'.lib.php'); 
     if(!($this->lib_{$lib} instanceof $lib)){ 
      $this->lib_{$lib} = new $lib(); 
     } else { 
      continue; 
     } 
    } 

但是,當我嘗試這個,我只是從apache得到一個500內部服務器錯誤。

我得到的錯誤是:

[15-Feb-2012 10:31:21] PHP Notice: Undefined property: load::$lib_ in /home/wwwsrv/public_html/system/core.lib.php on line 57 

(第57行是指符合if語句)

任何想法?

+0

來自日誌的錯誤信息是什麼? – Hamish 2012-02-15 00:30:25

+0

檢查您的錯誤日誌。每個錯誤500個日誌應在該文件*寫上正常安裝* – ariefbayu 2012-02-15 00:31:47

+0

與我越來越 – wyqydsyq 2012-02-15 00:35:25

回答

2

貌似你沒有初始化的成員變量,它匹配YOUR_CLASS :: $ lib_SOMELIB,所以PHP是扔的通知。

我會嘗試這樣的:

if ((!isset($this->lib_{$lib})) || 
    (!($this->lib_{$lib} instanceof $lib))) { 

而且,你可能要考慮使用魔術方法; __set and __get來動態設置YOUR_CLASS的成員變量,所以你不需要維護一個洗衣清單。

- 編輯#2 -

不知道爲什麼你所得到的stdObject錯誤,可能是已經嘗試初始化值早。看看這個片段,看看它是否有幫助。我測試了它並且工作。

class strings 
{ 
    public function __toString() 
    { 
     return __CLASS__; 
    } 
} 

class MyClass 
{ 
    private $dynamicMembers = array(); 

    public function loadLibs() 
    { 
     $libraries = array('strings'); 

     foreach ($libraries as $lib) { 

      // Had to do it this way, b/c it was resulting in lib_ and not lib_strings 
      $memberName = 'lib_' . $lib; 

      if ((!isset($this->$memberName)) || 
       (!($this->$memberName instanceof $lib))) { 
       var_dump(sprintf('I would have required: (%s)', 'lib/'.$lib.'.lib.php')); 
       $this->$memberName = new $lib(); 
      } else { 
       continue; 
      } 
     } 
    } 

    public function __set($name, $value) 
    { 
     $this->dynamicMembers[$name] = $value; 
    } 

    public function __get($name) 
    { 
     if (array_key_exists($name, $this->dynamicMembers)) { 
      return $this->dynamicMembers[$name]; 
     } 
    } 
} 

$myClass = new MyClass(); 

$myClass->loadLibs(); 

var_dump((string) $myClass->lib_strings); 
var_dump($myClass->lib_strings); 

exit; 

- 編輯#1 -

代碼的仔細檢查後,它將顯示你正在試圖創建再加上lazy-load pattern自動加載磁帶機。延遲加載在某些情況下運行良好,但請記住,調用代碼將很難設置要實例化的對象的特定成員屬性,如果這不是問題,則忽略。

此外,我建議對PHP的內置spl_autoload能力讀了。

+0

我仍然得到500錯誤,但現在沒有什麼是我的錯誤日誌來了,所以現在我更加困惑D: – wyqydsyq 2012-02-15 01:06:00

+0

嗯,不知道這一點,機會是有條件的現在傳遞,你更深入你的代碼。試着對有問題的文件進行'php -l'(lint檢查),並確保它編譯完成。 – 2012-02-15 01:10:48

+0

所以這500個錯誤是由我有要求INSIDE if語句引起的(它不能看出'$ this-> lib {$ lib}'是'instanceof $ lib',因爲這個類是在required中定義的尚未包含的文件)。我覺得我好笨。 無論如何,現在我得到了:致命錯誤:不能使用stdClass類型的對象作爲第50行的/home/clickash/public_html/system/core.lib.php中的數組(第50行是if語句) – wyqydsyq 2012-02-15 01:48:25

0

會爲你下面的工作更好嗎?

class Library_Loader { 
    protected $_loadedLibraries = array(); 

    public function load($library) { 
     if (!array_key_exists($library, $this->_loadedLibraries)) { 
      $path = realpath('lib/' . $library . '.lib.php'); 

      if (false === $path) { 
       throw new Exception("Invalid library $library"); 
      } 

      require_once $path; 
      $this->_loadedLibraries[$library] = new $library(); 
     } 

     return $this->_loadedLibraries[$library]; 
    } 
} 

$libraries = array('strings'); 
$loader = new Library_Loader; 

foreach ($libraries as $library) { 
    $loader->load($library); 
} 

你也可以看看wrapping this up into an autoloader,這樣你可以簡單地調用在你的代碼new strings();,並有一流的自動加載你。