【问题标题】:Accessing a protected member variable outside a class在类外访问受保护的成员变量
【发布时间】:2011-03-29 09:12:53
【问题描述】:

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

【问题讨论】:

标签: php class variables member protected


【解决方案1】:

从公共访问受保护或私有变量是不正确的(这就是它们被保护或私有的原因)。所以更好的是扩展类并访问所需的属性或制作 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 ReflectionProperty 为我工作。但不要忘记致电ReflectionProperty::setAccessible(true)
  • 这是正确答案。请注意,ReflectionProperty 的第一个参数必须是完全命名空间的类。
【解决方案2】:

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

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

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

$baz = new Foo();

echo $baz->getBar();

【讨论】:

  • 显然我们已经有了一个可以让我简单使用 ->getId() 并从各种类中检索的方法。
【解决方案3】:

正确答案如下:

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

【讨论】:

  • 哇!那好美丽。为什么这没有更多的选票??
【解决方案4】:

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

你不能:这就是protected 的全部意义所在。

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

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

【讨论】:

    【解决方案5】:

    你可以在类外访问类的受保护成员,也无需扩展受保护成员类,也无需使用受保护成员类的任何功能。使用下面的函数来访问它。

    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查看更多详情。

    【讨论】:

      【解决方案6】:

      如果你真的需要那个值:

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

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

      【讨论】:

        【解决方案7】:

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

        class ForExample
        {
            protected $var=122;
        }
        
        
        
        $call=function(){
        
            echo $this->var;
        };
        
        $call->call(new ForExample());
        

        【讨论】:

          【解决方案8】:

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

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

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

          【讨论】:

          • 这很好,但是 OP 需要 PHP 解决方案 :)
          • 好吧,我假设 PHP 支持继承和转换,我希望他能够理解 C++ 代码以在 PHP 中实现它:)
          • "显然我们已经有了一个,它允许我简单地使用 ->getId() 并从各种类中检索。- user275074" 唯一的负分答案是建议寻找访问者,以及替代解决方案不会让我感到被侵犯的地方:D
          猜你喜欢
          • 2017-08-01
          • 2016-10-01
          • 2021-07-24
          • 2010-12-22
          • 2014-06-07
          • 1970-01-01
          • 2019-04-18
          • 2013-12-22
          相关资源
          最近更新 更多