我通过访问某人已经放置的类函数来查询字段的ID。结果是返回带有受保护成员变量的对象。我很难看到如何访问类外的成员变量值。
答案 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是一个糟糕的编译器,所以我无法测试它。 }