2017-07-25 10 views
1

このエラーで多くの質問がありますが、私はまだ正しい解決策を見つける必要があります。私のものは厳密にPHP自体であり、他の人が例を投稿したようなフレームワークではありません。PHPオーバーロードされたプロパティの間接的な変更 - ARRAYS

__set__getでオーバーロードして、データアレイ内でこれらのプロパティを動的に作成しようとしていますが、下の例のようなプロパティを作成しようとするとこのエラーが発生します。しかし、文字列またはintの場合はプロパティを作成できます。なぜ値が渡されないのか理解できません。配列フィールドを生成しようとしている

public function __get($name) 
{ 
    if (array_key_exists($name, $this->data)) 
    { 
     return $this->data[$name]; 
    } 
} 

オーバーロードされた財産の間接変更は::フィールドは何の効果

クラスのgetterメソッドを持っていません。 (この例エラー)

$fieldset->fields[] = [ 
    'handle'  => 'first_name', 
    'name'  => 'First Name', 
]; 

これはうまく動作しますが、そのは私が尋ね、私はフィールドがインデックス配列になりたいではありません。

$fieldset->fields = [ 
    'handle'  => 'first_name', 
    'name'  => 'First Name', 
]; 

これが不可能な場合、誰がより良い方法を持っている場合、私は同じ結果に代わるものを知ってみたいです。みんなありがとう!

+0

最後の例では、連想配列を_is_。最初の例は、多次元配列です。あなたはあなたが探している結果を分かち合うことができますか? –

+0

@MagnusEriksson私は '$ fieldset-> fields'を' fields [0] '、' fields [1] '、' fields [2] 'などにしたいと思います。動的配列 '$ fields [] = 'value1''、' $ fields [] =' value2''を作成するのと同じように、それを説明することができます。 – timothymarois

+0

これは連想配列ではなく、インデックス配列です。しかし、あなたは '__set()'関数でそれを行うことはできません。新しい要素を配列のプロパティにプッシュする独自のメソッドを作成する必要があります。 –

答えて

5

__getマジックメソッドを変更して、referenceを配列に格納されたプロパティに戻します。この通知は、あなたが$this->data[fields]のコピーを価値によって得て、何かを追加していると言っています。クラスに格納されている実際のフィールドではなく、fields変数のコピーに追加します。これは、クラスに格納されている変数には影響しません。

存在しないキーを取得しようとすると(例外未定義変数と同様)、またはインデックスを作成して参照を返すときに、例外をスローする必要があります。この例では、後者を使用します。

例:

public function &__get($name) 
{ 
    if (!array_key_exists($name, $this->data)) 
    { 
     $this->data[$name] = null; 
    } 
    return $this->data[$name]; 
} 

デモ:https://3v4l.org/sdIWH

+0

ありがとうございます。私は他の解決策からそれを試しましたが、私は新しいエラー「型stdClassのオブジェクトを配列として使用できません」を送信します。デバッグしようとしていますが、 – timothymarois

+0

通知エラーを防ぐためにインデックスが存在しない場合は、インデックスを作成するために少し修正しました。また、PHPが送信する未定義の変数通知と同様の例外をスローすることもできます。 –

+0

どこからエラーが発生したかによって、 '$ this-> data'または' $ this-> data ['fields'] 'は配列ではなくオブジェクトです。あなたが配列のようにそれにアクセスしていたと考えて、私はそれがだと仮定しました。オブジェクトではなく配列として定義するか、またはappendが機能しないことを意味するクラスのように使用する必要があります。また、別のクラスで配列アクセスインタフェースを実装することもできます。配列とオブジェクトは全く異なるものです。オブジェクトはクラスのインスタンスです。 '$ this-> data'やフィールドをどのように定義しているのか分かりません。 –

関連する問題