我在哪里失去了我的对象上下文


Where am I losing my object context?

再尝试一下。我之前的问题已经被否决了。

我正在通过一个从未通过静态方法实例化的类加载一个类。然而,我正在加载的类应该是实例化的,但我怀疑执行从来没有这么远。这个类中没有静态的东西,但是php不断抛出:

**Fatal error: Using $this when not in object context**

这是整个类:

class Config{

    public $_config;

    public function load()
    {
        $modules = array();
        $modules = scandir(MOD);
        $n = count($modules);
        for($i=0;$i<$n;$i++)
        {
            if($modules[$i]==='.'||$modules[$i]==='..'||strpos($modules[$i],'.'))
            { unset($modules[$i]); }
        }
        $modules = array_values($modules);
        $m = count($modules);
        for($i=0;$i<$m;$i++)
        {
            $mod = $modules[$i];
            $this->_config[$mod] = array();// **Error thrown here.**
            $cfgfiles = scandir(MOD.DS.$mod.DS.'config');
            $num = count($cfgfiles);
            for($i=0;$i<$num;$i++)
            {
                if($cfgfiles[$i]==='.'||$cfgfiles[$i]==='..')
                    { unset($cfgfiles[$i]); }
            }
            $cfgfiles = array_values($cfgfiles);
            $k = count($cfgfiles);
            for($j=0;$j<$k;$j++)
            {
                include(MOD.DS.$mod.DS.'config'.DS.$cfgfiles[$j]);
                $modcfg = substr($cfgfiles[$j], 0, -4);
                $this->_config[$mod][$modcfg] = array();
                $this->_config[$mod][$modcfg] = $cfg;
            }
        } 
        return $this->_config;
    }
}

概述我的问题的更多信息可以在这里找到:

https://stackoverflow.com/questions/11653956/using-this-when-not-in-object-context-but-supposedly-i-am

好的,按照要求,这是调用这个类的代码,是的,它是一个静态函数。这就是我想知道的,但另一个类中的函数是静态的这一事实似乎对其他类的加载没有任何影响,只有这一个。

public static function init()
{
    $farray = scandir(SYS);
    for ($i=0;$i<count($farray);$i++)
        { if(strpos($farray[$i],'.php'))
        {
        $item = $farray[$i];
        require (SYS.DS.$item);
        $className = substr($item, 0, -4);
        self::$_names[] = $className;
        $obj = new $className();
        self::$_objs[] = $obj;
        self::$_classes = array_combine(self::$_names, self::$_objs);
        }
    }
}

public static function getClass($class)
{
    if(isset(self::$_classes[$class]))
        { return self::$_classes[$class]; }
    else
        { return false; }
}

好的,我在error($this->_config[$mod]=array())之前的行添加了一个debug_backtrace(),这就是我得到的,但我不明白它的意思。

array(2) 
 { [0]=> array(6) 
{ ["file"]=> string(25) "C:'xampp'htdocs'framework'fw.php" 
["line"]=> int(45) 
["function"]=> string(4) "load" 
["class"]=> string(6) "Config" 
["type"]=> string(2) "::" 
["args"]=> array(0) { } } 
[1]=> array(6) 
{ ["file"]=> string(26) "C:'xampp'htdocs'index.php" 
["line"]=> int(31) 
["function"]=> string(4) "init" 
["class"]=> string(2) "Fw" 
["type"]=> string(2) "::" 
["args"]=> array(0) { } } }

好的,我已经给每个回答这个问题的人发了一条短信。事实证明,我确实无意中对Fw::init中的Config::load进行了静态方法调用。因为我做了很多修改,一直修改到睡眼惺忪,我在不知不觉中得到了同一个类的两个不同版本,一个在我的服务器上,另一个在编辑器中。

我现在要学习如何使用源代码管理应用程序。

这里最有可能发生的事情是静态调用Config::load()方法。这种类型的代码将导致您在问题中引用的错误:

Config::load()

您可以通过实例化一个对象并在实例上调用load()方法来修复它。像这样:

$config = new Config();
$config->load();

尝试声明$_config=array()以开头

public $_config = array();

看看这是否有帮助。

它看起来很好,我为你安排了更好的间隔。。。

class Config {
    public $_config = array();
    public function load()
    {
        $modules = array();
        $modules = scandir(MOD);
        $n = count($modules);
        for($i=0; $i < $n; $i++)
        {
            if($modules[$i]==='.' || $modules[$i]==='..' || strpos($modules[$i],'.'))
            { 
                unset($modules[$i]); 
            }
        }
        $modules = array_values($modules);
        $m = count($modules);
        for($i=0; $i < $m; $i++)
        {
            $mod = $modules[$i];
            $this->_config[$mod] = array();// **Error thrown here.**
            $cfgfiles = scandir(MOD.DS.$mod.DS.'config');
            $num = count($cfgfiles);
            for($i=0; $i < $num; $i++)
            {
                if($cfgfiles[$i]==='.' || $cfgfiles[$i]==='..')
                { 
                    unset($cfgfiles[$i]); 
                }
            }
            $cfgfiles = array_values($cfgfiles);
            $k = count($cfgfiles);
            for($j=0; $j < $k; $j++)
            {
                include(MOD.DS.$mod.DS.'config'.DS.$cfgfiles[$j]);
                $modcfg = substr($cfgfiles[$j], 0, -4);
                $this->_config[$mod][$modcfg] = array();
                $this->_config[$mod][$modcfg] = $cfg;
            }
        } 
        return $this->_config;
    }
}