在PHP中如何访问对象中的":private"数组?

cwd*_*cwd 13 php arrays wordpress object data-structures

直到大约3.3beta1项WP_Admin_Bar Object可以使用这种类型的语法访问,例如更改现有菜单项之一的CSS类:

$wp_admin_bar->menu->{'wp-logo'}['meta']['class'] = 'new-class';
Run Code Online (Sandbox Code Playgroud)

运行print_r($wp_admin_bar)输出时看起来像这样:

WP_Admin_Bar Object
(
    [menu] => stdClass Object
        (
            [my-account] => Array
                (
Run Code Online (Sandbox Code Playgroud)

但是,围绕版本3.3beta2,上面用于更改菜单项的CSS类的语法不再有效,并且输出print_r($wp_admin_bar)显示该对象的不同结构:

WP_Admin_Bar Object
(
    [nodes:WP_Admin_Bar:private] => Array
        (
            [my-account] => stdClass Object
                (
                    [id] => my-account

                )
Run Code Online (Sandbox Code Playgroud)

我意识到Wordpress可能不希望我以这种方式摆弄菜单,如果有更标准化的方法来做到这一点,我很乐意使用它,但据我所知,只有两个功能可用于修改管理栏,add_menu_itemremove_menu_item,这些不能灵活地执行更改现有菜单项的属性等操作.

为了确认,我看到wp-includes/class-wp-admin-bar.php很明显Wordpress已经改变了他们定义变量的方式.

老班

class WP_Admin_Bar {
    var $menu;
    var $proto = 'http://';
    var $user;
Run Code Online (Sandbox Code Playgroud)

新课程

class WP_Admin_Bar {
    private $nodes = array();
    private $root = array();

    public $proto = 'http://';
    public $user;
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如果我有权访问该global $wp_admin_bar对象,我是否可以访问其中的对象nodes:WP_Admin_Bar:private?如果没有,是否有另一种方法来获取这些对象,例如创建一个扩展WP_Admin_Bar类的新类,然后从那里访问对象?

ps:我试图在不改变核心Wordpress文件的情况下克服这一挑战......

链接到该文件:http://phpxref.ftwr.co.uk/wordpress/nav.html?wp-includes/class-wp-admin-bar.php.source.html

Gor*_*don 12

如果您不想触摸核心文件,那么您必须使用Reflection:

$adminBar = new WP_Admin_Bar();
$reflector = new ReflectionObject($adminBar);
$nodes = $reflector->getProperty('nodes');
$nodes->setAccessible(true);
print_r($nodes->getValue($adminBar));
Run Code Online (Sandbox Code Playgroud)

hackish替代方案是将对象转换为数组,然后执行:

$adminbar = (array) new WP_Admin_Bar;
$nodes = $adminbar[chr(0) . 'WP_Admin_Bar' . chr(0) . 'nodes'];
print_r($nodes);
Run Code Online (Sandbox Code Playgroud)


Hom*_*er6 6

将它们更改为受保护的成员变量并扩展该类.

无论是谁与私人成员一起撰写课程,都会使课程"最终".这表明你应该总是把你的成员写成受保护的,除非有一个真正的,非常好的理由不这样做.

希望有帮助......