Php 调用未定义的方法时';它是静态的,存在吗?

Php 调用未定义的方法时';它是静态的,存在吗?,php,oop,Php,Oop,这似乎是在交互式命令行和简单脚本中发生的: 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 > echo (class_exists('

这似乎是在交互式命令行和简单脚本中发生的:

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 > 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

PHP5.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


当然<代码>定位System.php

<?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;
        }
    }
}
?>

我已经更改了文件名。

当然<代码>定位System.php

<?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;
        }
    }
}
?>

我已更改了文件名。

请确保您包含了正确的文件-可能是类文件中的某个回音,并查看它在包含时是否回音。如果没有回音,那么您得到的是错误的
System.php
文件


如果有一个文件与您在多个include路径中指定的名称相匹配,PHP将从最先出现的include路径中选择该文件。这可能是您希望从中读取文件的include路径,也可能不是,这就是为什么我从不依赖该设置,而只是绝对指定所有include。从:

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


(在此处转载我的评论作为答案,并对其进行了扩展,以供将来参考。)

确保您包含了正确的文件-可能是类文件中的某个回音,并查看它在包含时是否回音。如果没有回音,那么您得到的是错误的
System.php
文件


如果有一个文件与您在多个include路径中指定的名称相匹配,PHP将从最先出现的include路径中选择该文件。这可能是您希望从中读取文件的include路径,也可能不是,这就是为什么我从不依赖该设置,而只是绝对指定所有include。从:

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


(在此转载我的评论作为答案,并对其进行了扩展,以供将来参考。)

您应该在
require\u once(…)
中使用
dirname(\uuu文件)
。例如,如果您有一个包含两个文件ActiveRecord.php和DB.php的文件夹,并且希望引用ActiveRecord中的DB,请使用以下格式:

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

您应该在
require\u once(…)
中使用
dirname(\uuuu文件)
。例如,如果您有一个包含两个文件ActiveRecord.php和DB.php的文件夹,并且希望引用ActiveRecord中的DB,请使用以下格式:

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

确保包含正确的文件-可能是类文件中的某个回音,并查看它在包含时是否回音。确保包含正确的文件-可能是类文件中的某个回音,并查看它在包含时是否回音。我们的框架中有一个名为“Log”的类,我们的include_路径上有PEAR。显然,PEAR(无论如何,我们的安装)也有一个日志类,并且早在include_路径列表中,因此我们尝试使用的静态方法没有定义。我们的框架中有一个名为“Log”的类,我们的include_路径上有PEAR。显然,PEAR(无论如何我们的安装)也有一个日志类,并且早在include_路径列表中,因此我们尝试使用的静态方法没有定义。