3

次の設定があります。

index.php

   require_once "common.php";
   ...

common.php

   ...
   $obj = new MyClass;
   require_once "config.php"
   ...

config.php

   ...
   require_once "settings.php";
   ...

settings.php

   $obj->dostuff = true;
   ...

index.phpを開くと、次のようになります。厳格な基準:3のsettings.phpの空の値からデフォルトオブジェクトを作成する

config.php$obj->dostuff = true;の中に入れても、エラーメッセージは表示されません。

誰かが私がこのエラーを受け取る理由を説明できますか?私はそれを修正する方法を尋ねているのではなく、理由を理解するだけです。

編集:私の悪い私はサイトの各部分に2つのconfig.phpクラスを持っていました、そして私はそれらの1つで何かを変更しただけで、古いインクルード順序を別のものに残しました。

4

2 に答える 2

2

スコープの問題に見えます。settings.phpでは、$objにアクセスできません。PHPは標準クラスから新しいものを作成しており、警告を出します。入れて確認できます

echo get_class($obj);

あなたのsettings.phpで、エラーを生成している行の直後。それが「StdClass」をエコーする場合、それは事実です。

$ objが関数/メソッド内に作成されていないことを確認しますか?

于 2012-11-01T21:21:06.160 に答える
0

$ objがシステム全体でグローバルにアクセス可能なオブジェクトである場合は、シングルトンパターンを使用してどこからでもアクセスできます。

class MyClass
{
    protected static $_instance;

    static function getInstance()
    {
        if (null === self::$_instance) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }
}

その後、このクラスでメソッドを作成できます。オブジェクト自体を取得するには、次のコマンドを呼び出すだけです。

$obj = MyClass::getInstance();

さらに、そのメソッドの1つを呼び出したいだけで、何も返す必要がない場合は、次のようになります。

MyClass::getInstance()->objectMethod();

これは、統合されたシングルトンベースのシステム全体の操作を整理するための非常に効率的な方法であることがわかりました。

実際、私のプロジェクトではこれを使用して、システムのどこからでも構成を取得します。

class syConfig
{
    protected static $_instance;

    private $_config;

    static function getInstance()
    {
        if (null === self::$_instance) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    public function load($xmlString)
    {
        $xml = simplexml_load_string($xmlString);
        $this->_config = $xml;
    }

    public function getConfig()
    {
        return $this->_config;
    }
}
于 2012-11-01T21:45:13.910 に答える