17

我通过访问某人已经放置的类函数来查询字段的 ID。结果是一个带有受保护成员变量的对象。我正在努力了解如何访问类外的成员变量值。

4

8 回答 8

23

从公共访问受保护或私有变量是不正确的(这就是它们受到保护或私有的原因)。所以更好的是扩展类并访问所需的属性或制作 getter 方法来公开获取它。但是,如果您仍然想在不扩展的情况下获取属性,并且如果您使用的是 PHP 5,则可以使用反射类。实际上尝试ReflectionProperty类。

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

$rp = new ReflectionProperty('Foo', 'bar');
$rp->setAccessible(true);
echo $rp->getValue($foo);
于 2010-08-13T09:50:07.210 回答
18

只需在类中添加一个“get”方法。

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

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

$baz = new Foo();

echo $baz->getBar();
于 2010-08-13T11:22:07.703 回答
18

以下是正确答案:

我们可以使用 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!
于 2017-01-17T12:24:58.257 回答
4

我正在努力了解如何访问类外的成员变量值。

你不能:这就是protected.

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

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

于 2010-08-13T09:41:55.987 回答
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];
}

请访问链接以查看有关它的更多详细信息。

于 2016-08-18T14:40:41.293 回答
0

如果你真的需要那个值:

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

显然,类设计者认为您不需要尝试访问的值,否则他会添加一个方法来自己检索它。因此,重新考虑你在做什么。

于 2010-08-13T09:42:00.853 回答
0

例如,使用闭包访问 php 保护变量

class ForExample
{
    protected $var=122;
}



$call=function(){

    echo $this->var;
};

$call->call(new ForExample());
于 2020-05-01T18:25:22.967 回答
-4

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

好吧,首先,如果成员受到保护,那么原始设计者并不打算让您直接访问它们。您是否检查了访问器方法?

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

于 2010-08-13T09:43:37.170 回答