1

これでもう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()わかりました、行の直前にa を追加しました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 つの異なるバージョンになってしまいました。

私は今、ソース管理アプリケーションの使用方法を学ぶために出発します。

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 に答える