我通过访问某人已经放置的类函数来查询字段的 ID。结果是一个带有受保护成员变量的对象。我正在努力了解如何访问类外的成员变量值。
8 回答
从公共访问受保护或私有变量是不正确的(这就是它们受到保护或私有的原因)。所以更好的是扩展类并访问所需的属性或制作 getter 方法来公开获取它。但是,如果您仍然想在不扩展的情况下获取属性,并且如果您使用的是 PHP 5,则可以使用反射类。实际上尝试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();
以下是正确答案:
我们可以使用 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!
我正在努力了解如何访问类外的成员变量值。
你不能:这就是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];
}
请访问链接以查看有关它的更多详细信息。
如果你真的需要那个值:
- 修改类并添加一个返回所需值的公共方法。
- 如果您无法修改它,请考虑对其进行扩展并在那里公开值(它将是可访问的,因为它受到保护)。更喜欢第一个选项,这更像是一个黑客。
显然,类设计者认为您不需要尝试访问的值,否则他会添加一个方法来自己检索它。因此,重新考虑你在做什么。
例如,使用闭包访问 php 保护变量
class ForExample
{
protected $var=122;
}
$call=function(){
echo $this->var;
};
$call->call(new ForExample());
免责声明:我不记得如何编码。有一阵子了”。这可能完全关闭。
好吧,首先,如果成员受到保护,那么原始设计者并不打算让您直接访问它们。您是否检查了访问器方法?
如果没有,并且您确信您确实需要这些受保护的成员,您可以使用访问器扩展类型,强制转换并以这种方式获取它们。喜欢(在类似 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 的编译器很糟糕,所以我无法对其进行测试。}