访问类外的受保护成员变量

时间:2010-08-13 09:33:33

标签: php class variables member protected

我通过访问某人已经放置的类函数来查询字段的ID。结果是返回带有受保护成员变量的对象。我很难看到如何访问类外的成员变量值。

8 个答案:

答案 0 :(得分:18)

从公共中访问受保护或私有变量是不正确的(这就是为什么它们受到保护或私有)。所以更好的是扩展类和访问所需的属性或使getter方法公开。但是如果你仍然希望获得没有扩展的属性,并且如果你使用PHP 5,你可以使用Reflection类访问。实际上尝试ReflectionProperty类。

class Foo { protected $bar; }
$foo = new Foo();

$rp = new ReflectionProperty('Foo', 'bar');
$rp->setAccessible(true);
echo $rp->getValue($foo);

答案 1 :(得分:14)

只需在课程中添加“get”方法即可。

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

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

$baz = new Foo();

echo $baz->getBar();

答案 2 :(得分:13)

这是正确答案:

我们可以使用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!

答案 3 :(得分:4)

  

我很难看到如何访问类外的成员变量值。

你不能:这是protected的全部内容。

您必须使用为您提取变量的方法extend该类。

但是,您无法在实例化对象上执行此操作 - 您必须影响类定义,或者在创建对象时更改对象的类。

答案 4 :(得分:3)

您可以访问类的受保护成员,也可以不扩展受保护的成员类,也可以不使用受保护成员类的任何功能。使用以下功能访问它。

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

请访问Link查看有关详情的详细信息。

答案 5 :(得分:0)

如果你真的需要这个值:

  • 修改类并添加一个返回所需值的公共方法。
  • 如果您无法修改它,请考虑扩展它并在那里公开值(它将是可访问的,因为它受到保护)。喜欢第一个选项,这更像是一个黑客。

显然,班级设计师并不认为你需要你想要访问的价值,否则他会添加一种方法来自己检索它。因此,重新考虑你正在做的事情。

答案 6 :(得分:0)

例如,带闭包的acces php保护变量

class ForExample
{
    protected $var=122;
}



$call=function(){

    echo $this->var;
};

$call->call(new ForExample());

答案 7 :(得分:-3)

免责声明:我不记得如何编码。有一阵子了”。这可能完全没有了。

首先,如果成员受到保护,原设计师并不打算直接访问它们。你检查了访问方法了吗?

如果没有,并且你确信你确实需要这些受保护的成员,你可以使用访问器扩展类型,强制转换,并以这种方式获取它们。喜欢(在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是一个糟糕的编译器,所以我无法测试它。 }