摘要 腾兴网为您分享:PHP成员变量获取对比,智宽生活,掌上看家,闲鱼,企业滴滴等软件知识,以及零钱包app,酷家乐3d云设计软件,桌面美化工具,湖北教育,lol盒子,摩擦,visualassistx,布兰顿罗伊,国信软件,内什么app,番茄工作法app,企业品牌推广方案范文,广工教务系统,拼图定制,2017年高考数学全国一卷等软件it资讯,欢迎关注腾兴网。下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认为他们创...

下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。

有如下4个代码示例,你认为他们创建对象,并获得成员变量的速度排序是怎样的?

1:将成员变量设置为public,通过赋值操作给成员变量赋值,直接获取变量

 代码如下 复制代码

class Foo {

public $id;

}

$data = new Foo;

$data->id = 10;

echo $data->id;2:将成员变量设置为public,通过构造函数设置成员变量的值,直接获取变量

class Foo2 {

public $id;

public function __construct($id) {

$this->id = $id;

}

}

$data = new Foo2(10);

echo $data->id;

3:将成员变量设置为protected,通过构造函数设置成员变量的值,通过魔术方法获取变量

 代码如下 复制代码

class Foo3 {

protected $id;

public function __construct($id) {

$this->id = $id;

}

public function getId() {

return $this->id;

}

}

$data = new Foo3(10);

echo $data->getId();

4:将成员变量设置为protected,通过构造函数设置成员变量的值,通过成员方法获取变量

 代码如下 复制代码

class Foo4 {

protected $id;

public function __construct($id) {

$this->id = $id;

}//www.jquerycn.cn

public function __get($key) {

return $this->id;

}

}

$data = new Foo4(10);

echo $data->id;

按执行速度快慢排序: 1243

咱们先看其opcode:

 代码如下 复制代码

1:

1  ZEND_FETCH_CLASS 4  :4  'Foo'

2  NEW         $5 :4

3  DO_FCALL_BY_NAME   0

4  ASSIGN         !0, $5

5  ZEND_ASSIGN_OBJ   !0, 'id'

6  ZEND_OP_DATA    10

7  FETCH_OBJ_R   $9 !0, 'id'

8  ECHO            $92:

1  ZEND_FETCH_CLASS 4  :10 'Foo2'

2  NEW               $11 :10

3  SEND_VAL           10

4  DO_FCALL_BY_NAME  1

5  ASSIGN        !1, $11

6  FETCH_OBJ_R   $14 !1, 'id'

7  ECHO            $143:

1  ZEND_FETCH_CLASS 4  :15 'Foo3'

2  NEW            $16 :15

3  SEND_VAL        10

4  DO_FCALL_BY_NAME   1

5  ASSIGN         !2, $16

6  ZEND_INIT_METHOD_CALL !2, 'getId'

7  DO_FCALL_BY_NAME  0  $20

8  ECHO           $204:

1  ZEND_FETCH_CLASS 4  :21 'Foo4'

2  NEW            $22 :21

3  END_VAL         10

4  DO_FCALL_BY_NAME  1

5  ASSIGN           !3, $22

6  FETCH_OBJ_R    $25 !3, 'id'

7   ECHO      $25

根据上面的opcode,参照其在zend_vm_execute.h文件对应的opcode实现,我们可以发现什么?

一、PHP内核创建对象的过程分为三步:

1.ZEND_FETCH_CLASS 根据类名获取存储类的变量,其实现为一个hashtalbe EG(class_table) 的查找操作

2.NEW 初始化对象,将EX(call)->fbc指向构造函数指针。

3.调用构造函数,其调用和其它的函数调用是一样,都是调用zend_do_fcall_common_helper_SPEC

二、魔术方法的调用是通过条件触发的,并不是直接调用,如我们示例中的成员变量id的获取(zend_std_read_property),其步骤为:

1.获取对象的属性,如果存在,转第二步;如果没有相关属性,转第三步

2.从对象的properties查找是否存在与名称对应的属性存在,如果存在返回结果,如果不存在,转第三步

3.如果存在__get魔术方法,则调用此方法获取变量,如果不存在,报错

回到排序的问题:

一、第一个和第二个的区别是什么?

第二个的opcode比第一个要少,反而比第一个要慢一些,因为构造函数多了参数,多了一个参数处理的opcode。参数处理是一个比较费时的操作,当我们在做代码优化时,一些不必要的参数能去掉就去掉;当一个函数有多个参数时,可以考虑通过一个数组将其封装后传递进来。

二、为啥第三个最慢?

因为其获取参数其本质上是一次对象成员方法的调用,方法的调用成本高于变量的获取

三、为啥第四个比第三个要快?

因为第四个的操作实质上获取变量,只不过其内部实现了魔术方法的调用,相对于用户定义的方法,内部函数的调用的效率会高。因此,当我们有一些PHP内核实现的方法可以调用时就不要重复发明轮子了。

四、为啥第四个比第二个要慢?

因为在PHP的对象获取变量的过程中,当成员变量在类的定义不在在时,会去调用PHP特有的魔术方法__get,多了一次魔术方法的调用。

总结一下:

1.使用PHP内置函数

2.并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。

3.尽量少用魔术方法 -- 除非有必要,不要用框架,因为框架都有大量的魔术方法使用。

4.在性能优先的应用场景中,将成员变量不失为一种比较好的方法,当你需要用到OOP时。

5.能使用PHP语法结构的不要用函数,能使用内置函数的不要自己写,能用函数的不要用对象

相关推荐

php获取变量后几位,php获取变量类型_PHP成员变量获取对比相关推荐

  1. 将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的“a“改为“b“(封装成一个方法)

    import java.lang.reflect.Field;public class test06 {/** 将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的"a&q ...

  2. 如何定义一个布尔类型的成员变量

    一般情况下,我们可以有以下四种方式来定义一个布尔类型的成员变量: boolean success boolean isSuccess Boolean success Boolean isSuccess ...

  3. SpringMVC处理Date类型的成员变量方法

    2019独角兽企业重金招聘Python工程师标准>>> 在使用 SpringMVC 的时候,我们可能需要将一个对象从 View 传递给 Controller .而当这个 Object ...

  4. java成员变量默认是_在Java语言中,String类型的成员变量的默认初始值是( )

    在Java语言中,String类型的成员变量的默认初始值是( ) 答:C.null 学生最主要的权利是() 答:受教育权 提倡教育要适合孩子的 "敏感期"的教育家是 答:蒙台梭利 ...

  5. 类的成员变量 猜数字游戏一个类A有一个成员变量v有一个初值100。 * 定义一个类对A类的成员变量v进行猜。 * 如果大了则提示大了小了则提示小了。等于则提示猜测成功。

    /** 类的成员变量 猜数字游戏一个类A有一个成员变量v有一个初值100.* 定义一个类对A类的成员变量v进行猜.* 如果大了则提示大了小了则提示小了.等于则提示猜测成功.*/ import java ...

  6. win10添加环境变量后没用_教你Win10系统配置的环境变量未生效的解决方法

    教你Win10系统配置的环境变量未生效的解决方法.一些Win10小伙伴经常遇到配置了环境变量无法生效的情况.那么Win10系统安装了jdk,修改环境变量配置不生效要如何解决呢?有遇到此类问题的小伙伴就 ...

  7. python 私有和保护成员变量如何实现?—— 单下划线 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量; 双下划线 开始的是私有成员,意思是只有类对象自己能访问...

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量. 在python中定义私有变量只需要在变 ...

  8. C++类指针类型的成员变量的浅复制与深复制

    本篇文章旨在阐述C++类的构造,拷贝构造,析构机制,以及指针成员变量指针悬空问题的解决.需要读者有较好的C++基础,熟悉引用,const的相关知识. 引言: 类作为C++语言的一种数据类型,是对C语言 ...

  9. C语言边角料:结构体中指针类型的成员变量,它的类型重要吗?

    一.前言 昨天在编译代码的时候,之前一直OK的一个地方,却突然出现了好几个 Warning! 本着强迫症要消灭一切警告的做法,最终定位到:是结构体内部, 指向结构体类型的指针成员变量导致的问题. 这个 ...

最新文章

  1. UVA 1354 Mobile Computing
  2. 计算机在轻化工程中的应用,计算机在基础化学实验当中的应用
  3. CentOS6.5安装perl5.0(tar压缩包方式),有错误you may have to set your dynamic library LD_LIBRARY_PATH
  4. linux c c 常用的日志库,mslog: 一款超轻量级的C日志库,无需依赖额外的库,测试或移植过的系统有Linux(ubuntu,centos),Windows以及部分嵌入式设备;...
  5. 数据库查找姓李的人_最通俗易懂的理解什么是数据库
  6. 收到朋友寄来的煎饼了
  7. Python PIL 图像缩小、拼接
  8. Android的富文本功能
  9. Java 实验五 王奕开
  10. 车林通购车之家--购车计算器模块--算法js
  11. [来料检验]触摸屏来料检验设想
  12. vue中使用vue-baidu-map 实现点 弹窗 路线 行政区划分
  13. MAC打开outlook提示”正在修复 Main Profile“
  14. 如何才能不改变图片的像素大小,只改变图片的文件大小
  15. NP架构-汇聚层路由器完美选择
  16. 机器人java指南_Zmud新手机器人指南
  17. 2021年1~11月语音合成和语音识别论文月报
  18. FCOS搭建环境bug
  19. cron表达式及其验证方法
  20. Apollo自动驾驶之高精地图

热门文章

  1. 教你如何实现中间人攻击
  2. CSS学习笔记七---定位 精灵图
  3. Linux之符号链接
  4. ProM开发指北1——什么是ProM
  5. 网络安全 payload、shellcode、exp、poc
  6. 案例分析(三)linux-5.4 mmc无法挂载文件系统
  7. Android安卓移动开发工程师职业规划图
  8. 使用Hexo的helper-live2d插件自定义博客看板娘
  9. 【3D游戏编程与设计】一 游戏的分类与热点
  10. GPS的定位原理、定位方式与协议规范