獲取類的公有屬性及默認值(包含公有的靜態屬性),用來列舉類的公有屬性字段。php
獲取對象的公有屬性及屬性值(不包含公有的靜態屬性)。app
若是想要獲取對象的各種屬性(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()