1

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

我正在通过一个从未通过静态方法实例化的类加载一个类。然而,我正在加载的类应该被实例化,但我怀疑执行永远不会那么远。此类中没有任何静态内容,但 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()在 the 之前的行添加了一个,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 进行了静态方法调用。因为我做了很多修改并一直在努力,直到我睡眼惺忪,我不知不觉地结束了同一个课程的两个不同版本,一个在我的服务器上,一个在我的编辑器上。

我现在要去学习如何使用源代码控制应用程序。

4

2 回答 2

2

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

Config::load()

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

$config = new Config();
$config->load();
于 2012-07-27T15:57:38.257 回答
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;
    }

}
于 2012-07-27T15:56:01.987 回答