PHP開発では、プライベートとして定義されたクラスメンバーに直接アクセスしようとすると、「プライベートメンバーにアクセスしてみてください」でエラーが発生することがよくあります。この問題の基本的な理由は、PHPのアクセス制御メカニズムにあります。プライベートメンバーはクラスの内部的にのみアクセスできますが、外部アクセスは禁止されます。
PHPは、メンバーのアクセシビリティ範囲を制御するための3つのアクセス修飾子を提供します。
したがって、クラスの外部から直接プライベートメンバーにアクセスすると、エラーが発生します。
PHPのマジックメソッド__get()および__set()により、間接的にプライベートプロパティにアクセスできます。これら2つの方法では、プライベートメンバーの値を安全に読み取り、クラスの外で書くことができます。
クラスmyclass { private $ privatemember; パブリック関数__get($ name){ if($ name === 'privatemember'){ return $ this-> privatemember; } } パブリック関数__set($ name、$ value){ if($ name === 'privatemember'){ $ this-> privatemember = $ value; } } } $ obj = new MyClass(); $ obj-> privatemember = 'hello、world!'; //プライベートメンバーEcho $ obj-> privatememberを設定します。 //プライベートメンバーの値を得るして出力します
上記の例では、__get()を使用して、要求された属性名がprivatememberであるかどうかを判断し、対応する値を返します。 __set()を使用して、属性を割り当てます。これにより、プライベートメンバーへの直接アクセスによって引き起こされるエラーが回避されます。
アレイのような方法でプライベートメンバーにアクセスしたい場合は、クラスにPHPの組み込みアレイアクセスインターフェイスを実装し、柔軟なアクセスを実現する方法を書き換えることができます。
クラスMyClassはArrayAccessを実装しています{ private $ privatemember; パブリック関数offsetexists($ offset){ $ offset === 'privatemember'を戻るします。 } public function offsetget($ offset){ $ this-> $ offsetを戻るします。 } public function offsetset($ offset、$ value){ $ this-> $ offset = $ value; } パブリック関数offsetunset($ offset){ unset($ this-> $ offset); } } $ obj = new MyClass(); $ obj ['privatemember'] = 'hello、world!'; //プライベートメンバーECHO $ obj ['privatemember']を設定します。 //プライベートメンバーの値を得るして出力します
ArrayAccessインターフェイスを実装することにより、Arrayのような構文を使用してプライベートメンバーを操作し、コードの柔軟性をさらに向上させることができます。
PHPエラーが「プライベートメンバーにアクセスしてみてください」とプロンプトする場合、Magic Method __get()と__set()を使用するか、ArrayAccessインターフェイスを実装して、法的かつ安全な方法でプライベートメンバーにアクセスすることをお勧めします。これにより、エラーが回避されるだけでなく、コードがより拡張可能で保守可能になります。