我在哪里丢失对象上下文?

时间:2012-07-27 15:49:30

标签: php

再试一次。我已经将我之前提出的问题投了反对票。

我正在通过一个从未通过静态方法实例化的类加载类。我加载的类应该被实例化,但我怀疑执行永远不会那么远。这个类中没有任何静态,但是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; }
}

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

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进行了静态方法调用。因为我做了很多修改并且一直在努力,直到我眼花缭乱,我在不知不觉中最终得到了同一类的两个不同版本,一个在我的服务器上,另一个在我的编辑器中。

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

2 个答案:

答案 0 :(得分:2)

此处发生的最可能的事情是您静态调用Config::load()方法。此类代码会导致您在问题中引用错误:

Config::load()

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

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

答案 1 :(得分:0)

尝试声明$ _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;
    }

}