PHP 獲取類 / 對象的屬性字段及屬性值

get_class_vars

獲取類的公有屬性及默認值(包含公有的靜態屬性),用來列舉類的公有屬性字段。php

get_object_vars

獲取對象的公有屬性及屬性值(不包含公有的靜態屬性)。app

ReflectionClass

若是想要獲取對象的各種屬性(public/protected/private | static),就須要藉助強大的反射類來完成了。 PHP 提供了 \ReflectionClass::class 能夠幫助咱們解析類的實例對象,經過 \ReflectionClass::getProperties方法獲取對象全部的屬性值。this

實例

<?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()
相關文章
相關標籤/搜索