2010-11-09 58 views
0
php > require_once('System.php'); 
php > System::users(); 
PHP Fatal error: Call to undefined method System::users() in php shell code on line 1 

這似乎無論從交互式命令行,並從一個簡單的腳本發生:當它是靜態的並且存在時調用未定義的方法?

<?php 
require_once('System.php'); 
var_dump(System::users()); 
?> 

System.php是在PHP包括路徑 - 包括正確:

php > echo (class_exists('System')) ? 'THERE!' : 'WHERE?'; 
WHERE? 
php > require_once('System.php'); 
php > echo (class_exists('System')) ? 'THERE!' : 'WHERE?'; 
THERE! 
php > System::users(); 
PHP Fatal error: Call to undefined method System::users() in php shell code on line 1 

我很難理解爲什麼它說調用了一個未定義的方法,實際上它是靜態的,它在那裏,應該是可訪問的。

<?php 
class System 
{ 
    public static function users() 
    { 
     $users = array(); 

     if(!$data_array = file('/etc/passwd')) 
     { 
      return false; 
     } 

     foreach($data_array as $line) 
     { 
      $data = explode(":", $line); 
      $user = array_shift($data); 

       list(, $uid, $gid, $info, $path, $terminal) = $data; 

      $tmp = array(); 
      $tmp['uid'] = $uid; 
      $tmp['gid'] = $gid; 
      $tmp['name'] = array_shift(explode(',', $info)); 
      $tmp['path'] = $path; 
      $tmp['terminal'] = $terminal; 

      $users[$user] = $tmp; 

      unset($tmp); 
     } 

     return $users; 
    } 

    public static function user($user) 
    { 
     $users = self::users(); 

     if(array_key_exists($user, $users)) 
     { 
      return $users[$user]; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 
?> 

PHP 5.3.2-1ubuntu4.5用了Suhosin貼片(CLI)(建:2010年9月17日13時49分46秒)
版權所有(C)1997-2009的PHP集團
Zend Engine v2.3.0,版權所有(c)1998-2010 Zend Technologies

+0

確保您包括正確的文件 - 也許在類文件中的某處回聲,看看是否包含回聲。 – BoltClock 2010-11-09 01:50:31

回答

3

確保包含正確的文件 - 可能是類文件中的某個回聲,並查看它是否包含回聲。如果沒有回顯,你會得到錯誤的System.php文件。


如果有你在include路徑的不止一個指定的名稱相匹配的文件,PHP只會把它撿起來無論從任何包含路徑首先出現。這可能是也可能不是你期望你的文件被讀取的包含路徑,這就是爲什麼我不會依賴這個設置並且只是指定我所有的包含。從manual

PHP中include路徑的每個條目分別尋找文件,包括時考慮。它會檢查第一個路徑,如果找不到它,請檢查下一個路徑,直到找到包含的文件或返回警告或錯誤。

(轉貼我的評論作爲一個答案在這裏,並在它擴大,以供將來參考。)

+0

我們在我們的框架中有一個名爲「Log」的類,我們的include_path上有PEAR。顯然,PEAR(我們的安裝)也有一個Log類,並且早於include_path列表,因此我們試圖使用的靜態方法沒有定義。 – jakerella 2012-06-14 18:47:45

0

當然。 locate System.php

/opt/php-lib/System.php 
/usr/share/php/System.php 

我已經更改了文件名。

1

您應該使用dirname(__FILE__)require_once(...)。例如,如果你有兩個文件ActiveRecord.php和db.php中單個文件夾,你想從ActiveRecord的參考數據庫,請使用以下格式:

require_once(dirname(__FILE__).'/DB.php'); 
相關問題