私は私の試みで3つのトリックを使用しています:
- リフレクションは動的クラス プロパティでは使用できません
- 動的クラス プロパティにアクセスするときは、__get() または __set() を呼び出す必要があります。
- debug_backtrace() を利用して、次のようなものをエミュレートできます
private
Foo
プライベートな非静的プロパティを持つクラスの場合、外部のスコープがその値を変更すること$bar
を禁止したいと考えています。$this
したがって、私はこのようにしています:
/** @property object $bar */
class Foo{
public function __get($k){
if($k === "bar") return $this->bar;
}
public function __set($k, $v){
if($k === "bar"){
$trace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS);
if($trace[0]["object"] !== $this or $trace[0]["file"] !== __FILE__) throw new RuntimeException("Illegal access");
$this->bar = $v;
}
}
}
これは (テストされていませんが) 3 種類のアクセスに対して無敵である必要があります。
- 直接アクセス
- debug_backtrace() は、呼び出しコンテキストが $this からのものかどうかをチェックします。$this の外への直接アクセスは許可されません。
- 反射プロパティ
- PHP の致命的なエラー: キャッチされていない ReflectionException: プロパティ バーが存在しません
- リフレクションは動的プロパティでは機能しません。その存在を検出することすらありません
ReflectionClass::hasProperty()
:-)
Closure::bind
- テストされていませんが、 debug_backtrace() はFILEとは異なる「ファイル」を返す必要があると思いますが、クロージャを定義したファイルを返します。私は の正しい使い方しか持って
Foo
いないので、正しいコードがロードされている限り気にしません。
- テストされていませんが、 debug_backtrace() はFILEとは異なる「ファイル」を返す必要があると思いますが、クロージャを定義したファイルを返します。私は の正しい使い方しか持って
ファイルを書き込む権限がなく、クラス メソッドを再定義する拡張機能がないが、任意の PHP コードを読み込むことができると仮定すると、このFoo->bar
プロパティを変更するメソッドはありますか?