誰かがすでに配置しているクラス関数にアクセスして、フィールドのIDを照会しています。結果は、保護されたメンバー変数とともに返されるオブジェクトです。クラス外のメンバー変数値にアクセスする方法を見つけるのに苦労しています。
8 に答える
publicからprotectedまたはprivate変数にアクセスするのは正しくありません(そのため、それらはprotectedまたはprivateです)。したがって、クラスを拡張して必要なプロパティにアクセスするか、getterメソッドを作成して公開することをお勧めします。ただし、拡張せずにプロパティを取得したい場合や、PHP 5を使用している場合は、Reflectionクラスにアクセスできます。実際にReflectionPropertyクラスを試してください。
class Foo { protected $bar; }
$foo = new Foo();
$rp = new ReflectionProperty('Foo', 'bar');
$rp->setAccessible(true);
echo $rp->getValue($foo);
クラスに「get」メソッドを追加するだけです。
class Foo
{
protected $bar = 'Hello World!';
public function getBar()
{
return $this->bar;
}
}
$baz = new Foo();
echo $baz->getBar();
クラス外のメンバー変数値にアクセスする方法を見つけるのに苦労しています。
できません:それがの要点ですprotected
。
extend
変数をフェッチするメソッドを使用してクラスを作成する必要があります。
ただし、インスタンス化されたオブジェクトでこれを行うことはできません。クラス定義に影響を与えるか、オブジェクトが作成された時点でオブジェクトのクラスを変更する必要があります。
保護されたメンバークラスを拡張せずに、また保護されたメンバークラスの関数を使用せずに、クラスの外側にあるクラスの保護されたメンバーにアクセスできます。以下の関数を使用してアクセスします。
function getProtectedMember($class_object,$protected_member) {
$array = (array)$class_object; //Object typecast into (associative) array
$prefix = chr(0).’*’.chr(0); //Prefix which is prefixed to protected member
return $array[$prefix.$protected_member];
}
リンク先にアクセスして、詳細を確認してください。
その値が本当に必要な場合:
- クラスを変更し、必要な値を返すパブリックメソッドを追加します。
- 変更できない場合は、拡張して値を公開することを検討してください(保護されているため、アクセス可能になります)。最初のオプションをお勧めします。これはハックです。
明らかに、クラスデザイナーは、アクセスしようとしている値が必要だとは考えていませんでした。そうでなければ、自分で値を取得するメソッドを追加していたでしょう。したがって、あなたがしていることを再考してください。
免責事項:コーディング方法を覚えていません。「しばらく」経ちました。これは完全にオフになっている可能性があります。
さて、まず第一に、メンバーが保護されている場合、元のデザイナーはあなたがそれらに直接アクセスすることを意図していませんでした。アクセサメソッドを確認しましたか?
何も存在せず、これらの保護されたメンバーが本当に必要であると確信している場合は、アクセサーを使用してタイプを拡張し、キャストして、そのように取得できます。Like(C ++のようなコード)
class MyClass : public OldClass
{
public:
int getSomeValue() { return protectedValue; }
void setSomeValue(int value) { protectedValue=value; }
char* getOtherValue() { return otherProtectedValue; }
}
そしてそれを使用するには
MyClass* blah = (MyClass*)TheirFactory->GiveMeAClass();
int yay=blah->getSomeValue();
あなたはドリフトを取得します。これがあなたのために働くことを願っています、Internet Explorerはお粗末なコンパイラを作るので、私はそれをテストすることができませんでした。}