7

問題:以下に示すように PHP を拡張しようとしていArrayObjectます。残念ながら、多次元オブジェクトを設定するときに正しく動作させることができず、PHP で厳密な設定を有効にしているため、代わりにエラーがスローされます。( Error: Strict standards: Creating default object from empty value)

質問:クラスを変更して、存在しないレベルを自動的に作成するにはどうすればよいですか?

コード:

$config = new Config;
$config->lvl1_0 = true; // Works
$config->lvl1_1->lvl2 = true; // Throws error as "lvl1" isn't set already

class Config extends ArrayObject
{
    function __construct() {
        parent::__construct(array(), self::ARRAY_AS_PROPS);
    }

    public function offsetSet($k, $v) {
        $v = is_array($v) ? new self($v) : $v;
        return parent::offsetSet($k, $v);
    }
}
4

3 に答える 3

1

コピーしてコードを貼り付けたところ、PHPテストボックス(PHP 5.3.6を実行)で正常に機能します。厳格な基準の警告については言及されていますが、それでも期待どおりに機能します。print_rからの出力は次のとおりです。

Config Object
(
    [storage:ArrayObject:private] => Array
        (
            [lvl1_0] => 1
            [lvl1_1] => stdClass Object
                (
                    [lvl2] => 1
                )

        )

)

PHPのドキュメントには、あなたがやろうとしていることに関連するガイダンスを含むコメントがあることに注意してください。

sfinktah at php dot spamtrak dot org 2011年4月17日07:27ArrayObject
から独自のクラスを派生させ、完全なArrayObject機能(配列にキャストできるなど)を維持したい場合は、次を使用する必要があります。 ArrayObject自身のプライベートプロパティ「storage」。

詳細な説明は上記にリンクされてoffsetSetいますが、あなたが持っているものとoffsetGetxdazzが言及しているものに加えて、とを実装する必要がoffsetExistsありoffsetUnsetます。これは現在のエラーとは何の関係もありませんが、注意する必要があります。

更新: xdazzの後半はあなたの問題に対する答えを持っています。Configオブジェクトに配列としてアクセスすると、エラーなしで機能します。

$config = new Config;
$config[ 'lvl1_0' ] = true;
$config[ 'lvl1_1' ][ 'lvl2' ] = true;

あなたはそれをすることができますか、それとも何らかの理由でオブジェクト構文に制限されていますか?

于 2011-09-04T18:35:12.850 に答える
1

メソッドを実装しoffsetGetます。存在しないプロパティにアクセスしている場合は、必要に応じて作成できます。

ArrayObjectを拡張しているので、arrayway []を使用して設定または取得する必要があります。

于 2011-08-31T09:07:56.270 に答える