PHP中怎么获取类和对象的属性字段

发布时间:2021-06-29 16:44:38 作者:Leah
来源:亿速云 阅读:482

本篇文章为大家展示了PHP中怎么获取类和对象的属性字段,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

get_class_vars

获取类的公有属性及默认值(包含公有的静态属性),用来列举类的公有属性字段。

get_object_vars

获取对象的公有属性及属性值(不包含公有的静态属性)。

ReflectionClass

如果想要获取对象的各类属性(public/protected/private | static),就需要借助强大的反射类来完成了。 PHP 提供了 \ReflectionClass::class 可以帮助我们解析类的实例对象,通过 \ReflectionClass::getProperties方法获取对象所有的属性值。

实例

<?php

class Foo
{
    // 类常量
    const CLASS_NAME = "Foo";

    // 成员属性
    public $name;

    protected $sex = "female";

    private $age;

    // 类静态属性
    // php 的对象是可以访问类的 static 属性的
    // 但应该使用类的方式访问更为规范
    // const 属性只能通过类的方式访问
    public static $bar = "bar";

    public function __construct($name, $sex, $age)
    {
        $this->name = $name;
        $this->sex  = $sex;
        $this->age  = $age;
    }

    /**
     * 获取对象的属性字段及属性值
     * @param  [type]  $property_scope  属性域
     * @param  boolean $static_excluded 是否包含静态属性
     * @return array
     * @throws \ReflectionException|\Exception
     */
    public function getProperties($property_scope = null, $static_excluded = false)
    {
        // 校验反射域是否合法
        if (isset($property_scope) && !in_array($property_scope, [
            \ReflectionProperty::IS_STATIC,
            \ReflectionProperty::IS_PUBLIC,
            \ReflectionProperty::IS_PROTECTED,
            \ReflectionProperty::IS_PRIVATE,
        ])) {
            throw new Exception("reflection class property scope illegal!");
        }

        $properties_mapping = [];

        // 谈判官
        $classRef           = new \ReflectionClass($this);
        $properties         = isset($property_scope) ? $classRef->getProperties($property_scope) : $classRef->getProperties();

        foreach ($properties as $property) {
            // 为了兼容反射私有属性
            $property->setAccessible(true);

            // 当不想获取静态属性时
            if ($property->isStatic() && $static_excluded) {
                continue;
            }

            // 将得到的类属性同具体的实例绑定解析,获得实例上的属性值
            $properties_mapping[$property->getName()] = $property->getValue($this);
        }

        return $properties_mapping;
    }
}

$foo = new Foo("big_cat", "male", 29);

// 获取类的公有属性及默认值(包含静态属性)
var_dump(get_class_vars(get_class($foo)));

// 获取对象的公有属性及值(不包含类静态属性)
var_dump(get_object_vars($foo));

// 获取对象的静态属性
var_dump($foo->getProperties(\ReflectionProperty::IS_STATIC));
// 获取对象的公有属性 并排除静态属性
var_dump($foo->getProperties(\ReflectionProperty::IS_PUBLIC, true));
// 获取对象的保护属性
var_dump($foo->getProperties(\ReflectionProperty::IS_PROTECTED));
// 获取对象的私有属性
var_dump($foo->getProperties(\ReflectionProperty::IS_PRIVATE));

其他参考

/**
 * 获取类的常量属性
 * @see https://www.php.net/manual/en/reflectionclass.getconstants.php
 */
\ReflectionClass::getConstants()

/**
 * 获取类的方法
 * @see https://www.php.net/manual/en/reflectionclass.getmethods.php
 */
\ReflectionClass::getMethods()

上述内容就是PHP中怎么获取类和对象的属性字段,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. php - 类和对象
  2. C#中的字段与属性详解 .NET中的字段与属性详解_1

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php

上一篇:AutoScaling 生命周期的作用是什么

下一篇:php中怎么导出excel

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》