当它是静态的并且存在时调用未定义的方法?

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-Patch(cli)(构建时间:Sep 17 2010 13:49:46)
版权所有(c)1997-2009 The PHP Group
Zend Engine v2.3.0,版权所有(c)1998-2010 Zend Technologies


确保你包含正确的文件 - 可能是类文件中的某个回声,并查看它是否包含回声。 如果它没有被回显,你会得到错误的System.php文件。


如果有一个文件与您在多个包含路径中指定的名称相匹配,则PHP将首先从任何包含路径中选取它。 这可能是也可能不是你期望你的文件被读取的包含路径,这就是为什么我不会依赖这个设置并且只是指定我所有的包含。 从手册:

在查找要包含的文件时,PHP会分别考虑包含路径中的每个条目。 它会检查第一个路径,如果找不到它,请检查下一个路径,直到找到包含的文件或返回警告或错误。

(转发我的评论作为答案在这里,并将其扩展,供将来参考。)


您应该在require_once(...)使用dirname(__FILE__) require_once(...) 。 例如,如果您有一个包含ActiveRecord.php和DB.php两个文件的文件夹,并且您想从ActiveRecord引用数据库,请使用以下格式:

require_once(dirname(__FILE__).'/DB.php');

当然。 locate System.php

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

我更改了文件名称。

链接地址: http://www.djcxy.com/p/65069.html

上一篇: Call to undefined method when it's static and exists?

下一篇: MVC Server Side VS MVC Client Side and RESTful APIs