当前位置:首页 > PHP教程 > php应用 > 列表

PHP获取对象属性的三种方法实例分析

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-03 21:15:55 浏览: 评论:0 

本文实例讲述了PHP获取对象属性的三种方法,分享给大家供大家参考,具体如下:

今天查看yii源码,发现yii\base\Model中的attribute()方法是通过反射获取对象的public non-static属性,记得以前看到的代码都是用get_object_vars()这个函数获取的,昨天查看php文档,发现还可以用foreach遍历对象属性,于是写个例子练习下。

  1. class TestClass { 
  2.   private $a
  3.   protected $b
  4.   public $c
  5.   public $d
  6.   public static $e
  7.   private function funcA() { 
  8.   } 
  9.   protected function funcB() { 
  10.   } 
  11.   public function funcC() { 
  12.   } 
  13.   public function getPropertyMethodOne() { 
  14.     echo "[get_object_vars]", PHP_EOL; 
  15.     $vars = get_object_vars($this); 
  16.     foreach ($vars as $k => $v) { 
  17.       echo $k' => '$v, PHP_EOL; 
  18.     } 
  19.   } 
  20.   public function getPropertyMethodTwo() { 
  21.     echo "[foreach object]", PHP_EOL; 
  22.     foreach ($this as $k => $v) { 
  23.       echo $k' => '$v, PHP_EOL; 
  24.     } 
  25.   } 
  26.   public function getPropertyMethodThree() { 
  27.     echo "[reflection]", PHP_EOL; 
  28.     $class = new ReflectionClass($this); 
  29.     foreach ($class->getProperties(ReflectionProperty::IS_PUBLIC) as $property) { 
  30.       if (!$property->isStatic()) { 
  31.         echo $property->getName(), ' => '$property->getValue($this), PHP_EOL; 
  32.       } 
  33.     } 
  34.   } 

测试代码一

  1. $obj = new TestClass(); 
  2. echo "[get_object_vars]", PHP_EOL; 
  3. $vars = get_object_vars($obj); 
  4. foreach ($vars as $k => $v) { 
  5.   echo $k' => '$v, PHP_EOL; 
  6. echo "[foreach object]", PHP_EOL; 
  7. foreach ($obj as $k => $v) { 
  8.   echo $k' => '$v, PHP_EOL; 
  9. echo "[reflection]", PHP_EOL; 
  10. $class = new ReflectionClass($obj); 
  11. foreach ($class->getProperties(ReflectionProperty::IS_PUBLIC) as $property) { 
  12.   if (!$property->isStatic()) { 
  13.     echo $property->getName(), ' => '$property->getValue($obj), PHP_EOL; 
  14.   } 

输出:

  1. [get_object_vars] 
  2. c => 
  3. d => 
  4. [foreach object] 
  5. c => 
  6. d => 
  7. [reflection] 
  8. c => 
  9. d => 

可见,当着三种方法用在类的外部时,结果是一样的。get_object_vars()和foreach是获取到的是对象的public non-static属性,而通过反射的话则需要手动筛选出public non-static属性。

测试代码二

  1. $obj = new TestClass(); 
  2. $obj->getPropertyMethodOne(); 
  3. $obj->getPropertyMethodTwo(); 
  4. $obj->getPropertyMethodThree(); 

输出

  1. [get_object_vars] 
  2. a => 
  3. b => 
  4. c => 
  5. d => 
  6. [foreach object] 
  7. a => 
  8. b => 
  9. c => 
  10. d => 
  11. [reflection] 
  12. c => 
  13. d => 

可见,get_object_vars()和foreach用在类内部时,private、protected、public的实例属性都能获取到,反射就不用说了,通过手动筛选,各种类型的属性都能获取到。

Tags: PHP获取对象属性

分享到: