97

私のコードには、次のようなオブジェクト プロパティがあります。

$obj ->field_name_cars[0];
$obj ->field_name_clothes[0];

問題は、何百ものフィールド名があり、プロパティ名を動的に書き込む必要があることです。それ以外の場合、プロパティのオブジェクト名とキーは常に同じになります。だから私は試しました:

$obj -> $field[0];

プロパティの名前が動的に変更され、正しい値にアクセスできることを期待しています。しかし、私は 'undefined property $field in stdClass::$field;' を取得し続けます。

多かれ少なかれ、適切な値を出力できるように、実行する前にphpを動的に記述しようとしています。これにアプローチする方法についての考えは?

4

5 に答える 5

242

PHP7.0のアップデート

PHP 7では、パーサーレベルでの間接変数とプロパティの処理方法に変更が加えられました(詳細については、対応するRFCを参照してください)。これにより、実際の動作が期待に近づき、この場合$obj->$field[0]、期待される結果が得られることを意味します。

(現在改善されている)デフォルトの動作が望ましくない場合でも、以下に示すように、中括弧を使用してオーバーライドできます。

元の回答

次のようにアクセスを記述します。

$obj->{$field}[0]

この「中かっこで囲む」トリックは、変数変数によるあいまいさがある場合はいつでもPHPで役立ちます。

最初のコードを考えてみましょう。これは、「名前が指定されているプロパティにアクセスする」、または「名前が指定されているプロパティのキーを使用して要素にアクセス$obj->$field[0]する」という意味ですか?中かっこを使用すると、明示的にすることができます。$field[0]0$field

于 2012-09-24T19:07:23.597 に答える
36

他の配列/オブジェクトから値にアクセスするときに、次のような中括弧構文を使用して最もよく達成される変数-変数型表記を探していると思います。

$obj->{field[0]}
于 2012-09-24T19:08:01.497 に答える
11

魔法の方法__getはあなたの友達です:

class MyClass
{
   private $field = array();

   public function __get($name)
   {
      if(isset($this->field[$name]))
        return $this->field[$name];
      else
        throw new Exception("$name dow not exists");
   }
}

使用法:

$myobj = new MyClass();
echo $myobj->myprop;

説明:すべてのフィールドデータは配列に格納されます。アクセスする$myobj->mypropと、そのプロパティは明らかにクラスに存在しません。それが__get呼ばれるところです。__get配列内の名前を検索しfield、正しい値を返します。

于 2012-09-24T19:09:36.323 に答える