0

私は PHP にかなり慣れていませんが、私のように、このエラーの原因を見つけるために助けが必要な人を助けるためにここで共有している学習経験がありました。必要なことを実行するために、まだ見つけていない構文があるだけです。

したがって、問題は次のようなもので実証できます。

class Sample {
    protected $foo = array();
    public function magicSampleSetFunc($property, $key, $value) {
        $this->$property[$key] = $value;
    }
}
...
$s = new Sample();
$s->magicSampleSetFunc('foo', 'someKey', 'someVal');

明らかに、これは私の実際のコードではありません (実行したこともありません)。これは私の状況を説明するための最小限の例です。ここでは、明らかに配列であるメンバー変数 foo と、それにキーと値を設定しようとする汎用関数があります。var_dump$this->$propertyを実行して、それが配列であることを確認できますが、次の$this->$property[$key]行にエラー メッセージが表示されます。「警告: 無効な文字列オフセット 'someKey' in ...」

最初は、'someKey' は配列オフセットとして使用するのに違法な文字列であると言っていたのですが、これは意味がありませんでした。そして、それを isset でラップしても文句を言います。私が最初に学んだことは、php に文字列がある場合、配列アクセス演算子を使用してその文字列から文字を取得できるということです。したがって、警告メッセージは実際には、「someKey」が文字列への有効なオフセットではないことを訴えています (整数オフセットではないため)。わかりましたが、var_dumped$this->$propertyしただけで、それが配列であることがわかりました。2 番目のレッスンは、演算子の優先順位の 1 つでした。配列演算子「[]」は、間接演算子「->」よりも厳密に結合します。したがって、そのステートメントのバインディングは実際には次のようになります。( $this-> ( $property[$key] ) ). したがって、$key のインデックスによって $property の文字列を不正にオフセットしようとしています。私が望んでいたのは$this->$property、$key のインデックスによって配列をオフセットすることでした。

それでは、私の質問に移ります。私が学ぶ必要があり、まだ理解していない 3 番目の教訓は、この演算子の優先順位の問題をどのようにオーバーライドするかということです。試してみ($this->$property)[$key]ましたが、構文エラーのようです。私が何をしようとしているのかをインタプリタに理解させるために使用できる他の構文はありますか? または、$this->$property最初に一時変数に代入する必要がありますか? もしそうなら、それは私の実際のメンバー変数配列が更新されていないことを意味しませんか? 一時参照などが必要ですか? ここで私の状況に適した構文は何ですか? ありがとう!

4

1 に答える 1

2

これがその方法です。変数名は基本的に{$property}そうです。そうすると、$this->$property[$key]PHPパーサーが混乱すると思います。私は通常、変数名が $property であることをパーサーに明示的に示すようにします。これは、変数を中かっこで囲むことによって行われます。

中括弧は、変数名の末尾を明示的に指定するために使用されます

class Sample {
    protected $foo = array();
    public function magicSampleSetFunc($property, $key, $value) {
        $this->{$property}[$key] = $value;
    }
}
...
$s = new Sample();
$s->magicSampleSetFunc('foo', 'someKey', 'someVal');
于 2013-05-12T23:32:48.020 に答える