1

元の質問をそのまま残しましたが、私の質問の仮定に欠陥があることを指摘したかったのです。詳細についてはアップデートをお読みください


これが PHP では機能しないことに驚きました。

$someObjects = array();

function getInstance( $key )
{
    if ( ! $someObjects[$key] )
       $someObjects[$key] = new Object;

    return $someObjects[$key];
}

getInstance( 'mykey' )->property = 33;

最後の行で致命的なエラーが発生します。

PHP Fatal error:  Can't use function return value in write context

これは、私が Actionscript で時折使用するパターンであり、一連のオブジェクトを明示的に (構成ファイルなどで) 定義する必要があり、インスタンス化のステップをスキップしたいが、オブジェクトを処理したくない場合に便利です。ネストされた配列の束の混乱。

助言がありますか?


アップデート

これは、回答を読んだ後の当たり前の瞬間の 1 つです。getInstance( 'mykey' )->property = 33私の質問は、それが致命的なエラーの根本原因であると誤って想定しています。

私のコード例はずさんで、2 つの大きな問題がありました (おっと):

  1. global関数本体で を宣言しませんでした
  2. ! $array[$key]の代わりに誤って使用empty($array[$key])

これらの問題は私のプロジェクト コードにもありましたが、致命的なエラーの唯一の理由ではないようです。その後、プロジェクト コードを変更しましたが、他の要因が何であるかを理解できません (?)。とにかく姿勢が正されました。

以下の提案の後、これは私が目指していた構文です:

class MetaInfo
{
    public $title;
    public $description;
}

/**
 * @param $key string
 * @return MetaInfo
 */
function getMeta( $key )
{
    global $meta;

    if ( empty($meta[$key]) )
        $meta[$key] = new MetaInfo;

    return $meta[$key];
}

getMeta( 'path/to/page' )->title = "Double-check your work before posting";
4

1 に答える 1

3

これは PHP 5.0.0でサポートされていますが、どのように機能するようになったのかはわかりません。$someObjectsの範囲では使用できませんgetInstance()。これが私がテストしたもので、動作します:

<?php
class Object
{
    public $property;
}

function getInstance( $key )
{
    static $someObjects;
    if ( ! $someObjects[$key] )
       $someObjects[$key] = new Object;

    return $someObjects[$key];
}

echo getInstance( 'mykey' )->property = 33;  // prints 33 as expected
于 2013-01-13T19:11:27.237 に答える