gpt4 book ai didi

php - 为什么 print_r 不显示 WP_User 对象的所有属性?

转载 作者:可可西里 更新时间:2023-11-01 01:13:10 25 4
gpt4 key购买 nike

如果我这样做,我会显示许多属性,包括 display_name,但不会显示名字和姓氏

$user = get_userdata( 4 );
print_r( $user );

但是它们显然存在,因为如果我之后立即这样做,我会看到正确的姓氏。 Wordpress 文档还提到 last_name 是一个属性。

echo $user->last_name;

那么为什么 print_r 不显示所有属性呢?这对能否使用 print_r 发现信息产生了很大的疑问。

最佳答案

last_name 不是 WP_User 的真实属性,但为了向后兼容,它可以通过魔术方法使用。

它被列为公共(public)属性(property) in the docs ,但这有点误导。更准确地说,您可以将其作为公共(public)属性(property)访问。但是当你看the code ,它正在使用魔术方法进行检索和设置。

代码证明

这里是最相关代码的摘录,展示了 Wordpress 实际上如何在名为 back_compat_keys。当用户请求这些属性之一时,将调用魔法方法 __get。魔术方法使用 get_user_meta() 实际检索该属性的数据。换句话说,数据实际上并未存储在 WP_User 对象中; Wordpress 只是让你假装它是,它只在明确请求时才获取它。这是代码:

<?php
class WP_User {
// ...
/**
* @static
* @since 3.3.0
* @access private
* @var array
*/
private static $back_compat_keys;

public function __construct( $id = 0, $name = '', $blog_id = '' ) {
if ( ! isset( self::$back_compat_keys ) ) {
$prefix = $GLOBALS['wpdb']->prefix;
self::$back_compat_keys = array(
'user_firstname' => 'first_name',
'user_lastname' => 'last_name',
'user_description' => 'description',
'user_level' => $prefix . 'user_level',
$prefix . 'usersettings' => $prefix . 'user-settings',
$prefix . 'usersettingstime' => $prefix . 'user-settings-time',
);
}

// ...
}

// ...

/**
* Magic method for accessing custom fields.
*
* @since 3.3.0
* @access public
*
* @param string $key User meta key to retrieve.
* @return mixed Value of the given user meta key (if set). If `$key` is 'id', the user ID.
*/
public function __get( $key ) {
// ...

if ( isset( $this->data->$key ) ) {
$value = $this->data->$key;
} else {
if ( isset( self::$back_compat_keys[ $key ] ) )
$key = self::$back_compat_keys[ $key ];
$value = get_user_meta( $this->ID, $key, true );
}

// ...

return $value;
}

/**
* Magic method for setting custom user fields.
*
* This method does not update custom fields in the database. It only stores
* the value on the WP_User instance.
*
* @since 3.3.0
* @access public
*
* @param string $key User meta key.
* @param mixed $value User meta value.
*/
public function __set( $key, $value ) {
if ( 'id' == $key ) {
_deprecated_argument( 'WP_User->id', '2.1.0',
sprintf(
/* translators: %s: WP_User->ID */
__( 'Use %s instead.' ),
'<code>WP_User->ID</code>'
)
);
$this->ID = $value;
return;
}

$this->data->$key = $value;
}

/**
* Magic method for unsetting a certain custom field.
*
* @since 4.4.0
* @access public
*
* @param string $key User meta key to unset.
*/
public function __unset( $key ) {
// ...

if ( isset( $this->data->$key ) ) {
unset( $this->data->$key );
}

if ( isset( self::$back_compat_keys[ $key ] ) ) {
unset( self::$back_compat_keys[ $key ] );
}
}

// ...
}

关于php - 为什么 print_r 不显示 WP_User 对象的所有属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47586038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com