如何将 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
只有在您的对象上调用未找到的方法时才会被调用。
我正在开发一个 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
只有在您的对象上调用未找到的方法时才会被调用。