【发布时间】:2011-03-29 09:12:53
【问题描述】:
我通过访问某人已经放置的类函数来查询字段的 ID。结果是一个带有受保护成员变量的对象。我正在努力了解如何访问类外的成员变量值。
【问题讨论】:
-
你用的是什么语言??
标签: php class variables member protected
我通过访问某人已经放置的类函数来查询字段的 ID。结果是一个带有受保护成员变量的对象。我正在努力了解如何访问类外的成员变量值。
【问题讨论】:
标签: php class variables member protected
从公共访问受保护或私有变量是不正确的(这就是它们被保护或私有的原因)。所以更好的是扩展类并访问所需的属性或制作 getter 方法来公开获取它。但是,如果您仍然想在不扩展的情况下获取属性,并且如果您使用的是 PHP 5,则可以使用 Reflection 类。实际尝试ReflectionProperty 类。
class Foo { protected $bar; }
$foo = new Foo();
$rp = new ReflectionProperty('Foo', 'bar');
$rp->setAccessible(true);
echo $rp->getValue($foo);
【讨论】:
ReflectionProperty 为我工作。但不要忘记致电ReflectionProperty::setAccessible(true)。
只需在类中添加一个“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];
}
请访问Link查看更多详情。
【讨论】:
如果你真的需要那个值:
很明显,类设计者认为您不需要尝试访问的值,否则他会添加一个方法来自己检索它。因此,请重新考虑您在做什么。
【讨论】:
例如使用闭包访问 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 的编译器很糟糕,所以我无法对其进行测试。 }
【讨论】: