加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱制作网_潮州站长网 (http://www.0768zz.com/)- 物联安全、建站、操作系统、云计算、数据迁移!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP获取对象属性的三种方法实例详解

发布时间:2022-07-14 12:13:48 所属栏目:PHP教程 来源:互联网
导读:本文实例讲述了PHP获取对象属性的三种方法,分享给大家供大家参考,具体如下: 今天查看yii源码,发现yiibaseModel中的attribute()方法是通过反射获取对象的public non-static属性,记得以前看到的代码都是用get_object_vars()这个函数获取的,昨天查看php
  本文实例讲述了PHP获取对象属性的三种方法,分享给大家供大家参考,具体如下:
 
  今天查看yii源码,发现yiibaseModel中的attribute()方法是通过反射获取对象的public non-static属性,记得以前看到的代码都是用get_object_vars()这个函数获取的,昨天查看php文档,发现还可以用foreach遍历对象属性,于是写个例子练习下。
 
  class TestClass {
    private $a;
    protected $b;
    public $c;
    public $d;
    public static $e;
    private function funcA() {
    }
    protected function funcB() {
    }
    public function funcC() {
    }
    public function getPropertyMethodOne() {
      echo "[get_object_vars]", PHP_EOL;
      $vars = get_object_vars($this);
      foreach ($vars as $k => $v) {
        echo $k, ' => ', $v, PHP_EOL;
      }
    }
    public function getPropertyMethodTwo() {
      echo "[foreach object]", PHP_EOL;
      foreach ($this as $k => $v) {
        echo $k, ' => ', $v, PHP_EOL;
      }
    }
    public function getPropertyMethodThree() {
      echo "[reflection]", PHP_EOL;
      $class = new ReflectionClass($this);
      foreach ($class->getProperties(ReflectionProperty::IS_PUBLIC) as $property) {
        if (!$property->isStatic()) {
          echo $property->getName(), ' => ', $property->getValue($this), PHP_EOL;
        }
      }
    }
  }
  测试代码一
 
  $obj = new TestClass();
  echo "[get_object_vars]", PHP_EOL;
  $vars = get_object_vars($obj);
  foreach ($vars as $k => $v) {
    echo $k, ' => ', $v, PHP_EOL;
  }
  echo "[foreach object]", PHP_EOL;
  foreach ($obj as $k => $v) {
    echo $k, ' => ', $v, PHP_EOL;
  }
  echo "[reflection]", PHP_EOL;
  $class = new ReflectionClass($obj);
  foreach ($class->getProperties(ReflectionProperty::IS_PUBLIC) as $property) {
    if (!$property->isStatic()) {
      echo $property->getName(), ' => ', $property->getValue($obj), PHP_EOL;
    }
  }
  输出:
 
  [get_object_vars]
  c =>
  d =>
  [foreach object]
  c =>
  d =>
  [reflection]
  c =>
  d =>
  可见,当着三种方法用在类的外部时,结果是一样的。get_object_vars()和foreach是获取到的是对象的public non-static属性,而通过反射的话则需要手动筛选出public non-static属性。
 
  测试代码二
 
  $obj = new TestClass();
  $obj->getPropertyMethodOne();
  $obj->getPropertyMethodTwo();
  $obj->getPropertyMethodThree();
  输出
 
  [get_object_vars]
  a =>
  b =>
  c =>
  d =>
  [foreach object]
  a =>
  b =>
  c =>
  d =>
  [reflection]
  c =>
  d =>
  可见,get_object_vars()和foreach用在类内部时,private、protected、public的实例属性都能获取到,反射就不用说了,通过手动筛选,各种类型的属性都能获取到。
 
 

(编辑:我爱制作网_潮州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读