访问帖子的受保护属性

时间:2015-03-26 作者:rob-gordon

Fatal error: 无法访问受保护的属性Some\\u插件:$\\u Some\\u属性

访问附在帖子上的受保护属性的最佳/破坏性最小的方式是什么。

该属性由插件附加到帖子上,但我需要访问它存储的信息才能显示。

我能想到的选项有:

更改插件代码。我对面向对象的PHP不太熟悉,所以我不太愿意这样做,以免损坏其功能

  • 以某种方式调用插件,以便在正确的上下文中检索信息(可能使用functions.php中的函数)
  • 编写一个函数,该函数挂钩于此帖子类型的发布,并将信息复制到帖子的一个新的、不受保护的属性
  • 是否有人有任何建议或代码示例来说明最好的方法。如果您需要更多信息,请发表评论,我会更新问题。

    谢谢

    2 个回复
    最合适的回答,由SO网友:Tom J Nowell 整理而成

    这里获取动态成员变量的简单方法是使用反射!

    假设我们有这样一节课:

    class MyClass {
         private $myProperty = true;
    }
    
    我们可以使用反射来获取类和属性:

    $class = new ReflectionClass("MyClass");
    $property = $class->getProperty("myProperty");
    
    然后,我们可以将该属性设置为可访问:

    $property->setAccessible(true);
    
    现在,我们可以使用新的$property 对象:

    $obj = new MyClass();
    echo $property->getValue($obj); // Works
    
    请注意,如果直接访问成员变量,则该变量仍然是私有的:

    echo $obj->myProperty; // Error
    
    然而,您的代码暗示了一个静态成员变量,例如:

    class Some_Plugin
        private static $_some_property;
    }
    
    这可能不适用于

    SO网友:rob-gordon

    谢谢你@TomJNowell,我最终没有使用反射类,但你的回答有足够的关于类的信息让我走上了正确的轨道。我的步骤是这样的。

    我在插件目录的php文件中搜索包含我想在模板中使用的属性的行。

    grep --include=\\*.php -rnw \'/path/to/plugin\' -e "_some_property"
    
    我搜遍了所有的线,最终发现这处房产的名字是这样的:

    $property = Plugin_Registry::instance()->load_model(\'Someproperty\' )->get_property( $post_id );
    
    在我的模板文件中,我进行了测试,以查看是否可以访问Plugin_Registry

    class_exists(Plugin_Registry) // = 1
    
    然后,我就可以直接将这一行复制到我的模板中,并拥有我想要的所有属性。

    结束