programing

PHP에서 오브젝트 내의 ":private" 배열에 액세스하려면 어떻게 해야 합니까?

bestprogram 2023. 2. 26. 16:26

PHP에서 오브젝트 내의 ":private" 배열에 액세스하려면 어떻게 해야 합니까?

최대 약 3.3beta1 항목까지WP_Admin_Bar Object에는 다음과 같은 구문을 사용하여 접근할 수 있습니다.예를 들어 기존 메뉴 항목 중 하나의 CSS 클래스를 변경할 수 있습니다.

$wp_admin_bar->menu->{'wp-logo'}['meta']['class'] = 'new-class';

실행 시print_r($wp_admin_bar)출력은 다음과 같습니다.

WP_Admin_Bar Object
(
    [menu] => stdClass Object
        (
            [my-account] => Array
                (

단, 버전 주변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

                )

Wordpress는 이런 식으로 메뉴를 만지는 것을 원하지 않을 수 있다는 것을 알고 있습니다.또한 좀 더 표준화된 방법이 있다면 사용하고 싶지만 관리 바를 변경할 수 있는 기능은 두 가지뿐입니다.add_menu_item그리고.remove_menu_item기존 메뉴 항목의 속성을 변경하는 등의 유연성은 없습니다.

확인을 위해, 저는wp-includes/class-wp-admin-bar.php워드프레스가 변수를 정의하는 방법을 바꾼 것은 분명하다.

구 클래스

class WP_Admin_Bar {
    var $menu;
    var $proto = 'http://';
    var $user;

새 클래스

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

    public $proto = 'http://';
    public $user;

그래서 제 질문은 제가 이 컴퓨터에 접속할 수 있는지 여부입니다.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

코어 파일을 만지고 싶지 않으면Reflection:

$adminBar = new WP_Admin_Bar();
$reflector = new ReflectionObject($adminBar);
$nodes = $reflector->getProperty('nodes');
$nodes->setAccessible(true);
print_r($nodes->getValue($adminBar));

해키한 대안은 오브젝트를 배열에 배치한 후 다음 작업을 수행하는 것입니다.

$adminbar = (array) new WP_Admin_Bar;
$nodes = $adminbar[chr(0) . 'WP_Admin_Bar' . chr(0) . 'nodes'];
print_r($nodes);

보호된 멤버 변수로 변경하고 클래스를 확장합니다.

개인 회원들과 함께 수업을 만든 사람이 누구든 간에 사실상 수업을 "최종"으로 만들었다.그것은 당신이 회원들을 항상 보호받고 있다고 써야 한다는 것을 보여줍니다. 다른 좋은 이유가 없다면 말이죠.

도움이 됐으면 좋겠는데...

질문을 올바르게 이해했다면 객체의 개인 변수에 액세스할 수 있는지 물어보는 것입니다. 그러나 클래스에서 해당 변수에 대한 방법이 없으면 액세스할 수 없다는 것을 알고 있을 것입니다. 따라서 이것은 사소한 쓸모 없는 대답일 수 있습니다. 하지만 만약을 위해:

반의 코드를 보세요.get_nodes(), get_root() 등의 변수를 취득하는 메서드가 있습니까?3가지 대안이 없는 경우: 클래스의 public 설정, 클래스의 재코딩과 메서드의 추가, 클래스의 재코딩과 보호의 어느 쪽인가 하면, 이러한 메서드로 부모 클래스를 확장하는 새로운 클래스를 만듭니다(부모 클래스에 미치는 영향이 적기 때문에, 이것을 추천합니다).

어쨌든 클래스를 재코딩할 수 없고 get 메서드가 없으면 이러한 개인 변수에 액세스할 수 없습니다.

언급URL : https://stackoverflow.com/questions/8286798/in-php-how-can-i-access-a-private-array-in-an-object