web-dev-qa-db-ja.com

クラス外の保護されたメンバー変数へのアクセス

誰かがすでに配置しているクラス関数にアクセスして、フィールドのIDを照会しています。結果は、保護されたメンバー変数とともに返されるオブジェクトです。クラス外のメンバー変数値にアクセスする方法を見つけるのに苦労しています。

14
user275074

クラスに「get」メソッドを追加するだけです。

class Foo
{
    protected $bar = 'Hello World!';

    public function getBar()
    {
        return $this->bar;
    }
}

$baz = new Foo();

echo $baz->getBar();
14
shakerz

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);
18
Pawka

正解は次のとおりです。

Closureクラスのbind()またはbindToメソッドを使用して、次のようなクラスのプライベート/保護されたデータにアクセスできます。

class MyClass {
          protected $variable = 'I am protected variable!';
}

$closure = function() {
          return $this->variable;
};

$result = Closure::bind($closure, new MyClass(), 'MyClass');
echo $result(); // I am protected variable!
14
Kaszoni Ferencz

クラス外のメンバー変数値にアクセスする方法を見つけるのに苦労しています。

できません:それがprotectedの要点です。

変数をフェッチするメソッドを使用して、クラスをextendする必要があります。

ただし、インスタンス化されたオブジェクトでこれを行うことはできません。クラス定義に影響を与えるか、オブジェクトが作成された時点でオブジェクトのクラスを変更する必要があります。

4
Pekka 웃

保護されたメンバークラスを拡張せずに、また保護されたメンバークラスの機能を使用せずに、クラス外のクラスの保護されたメンバーにアクセスできます。以下の機能を使用してアクセスしてください。

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];
}

詳細については、 リンク をご覧ください。

3
Suraj

その値が本当に必要な場合:

  • クラスを変更し、必要な値を返すパブリックメソッドを追加します。
  • 変更できない場合は、拡張して値を公開することを検討してください(保護されているため、アクセス可能になります)。最初のオプションをお勧めします。これはハックです。

明らかに、クラス設計者は、アクセスしようとしている値が必要だとは考えていませんでした。そうでなければ、自分で値を取得するメソッドを追加していたでしょう。したがって、あなたがしていることを再考してください。

0
Artefacto