如何将 WP_User 封装在一个新的 class 中并直接访问属性和方法?

How to encapsulate WP_User in a new class and access directly both properties and methods?

我正在开发一个 WordPress 主题,但遇到了一个我无法解决的问题。我需要使用许多新方法和属性“扩展”WP_User class 对象。起初我考虑通过继承扩展 class,但我总是从一个已经存在的 WP_User 对象开始,所以如果我使用扩展,我实际上会创建一个新对象,该对象在以下情况下不会保持对齐改变为原来的。所以我决定封装已经存在的WP_User类型对象。然后我写了下面的class:

class My_User {
    protected WP_User $wp_user;

    public function __construct($user) {
        $this->wp_user = $user;
    }

    public function __get( $key ) {
        if ( isset( $this->$key ) ) { // I have all My_User properties set
            $value = $this->$key;
        } else {
            $value = $this->wp_user->$key;
        }
        return $value;
    }
}

一个用法示例是

$wp_user = wp_get_current_user();
$my_user = new My_User($wp_user);

多亏了魔法函数 __get() 我可以直接访问封装对象的属性,就好像它们是 My_User 的属性一样,但是我怎样才能对方法也做同样的事情呢?比如,有没有办法通过写$my_user->exists()来调用$wp_user->exists()而不用一一重写所有方法?类似于 __get() 的魔术函数,但用于方法而不用于属性?

你搜索的是__call神法。有关此内容,请参阅 php doc

使用起来非常简单:

class My_User {
    protected WP_User $wp_user;

    public function __construct($user) {
        $this->wp_user = $user;
    }

    public function __call( $method, $args ) {
         return $this->wp_user->$method(...$args);
    }
}

您不需要对 $this 进行任何测试,因为 __call 只有在您的对象上调用未找到的方法时才会被调用。