php面向对象程序设计中self与static的区别分析


Posted in PHP onMay 21, 2019

本文实例讲述了php面向对象程序设计中self与static的区别。分享给大家供大家参考,具体如下:

1、假设我们有个Car类,它有2个方法:model()getModel()

class Car{
 public function model(){
  //这里我们使用了关键字self
  self::getModel();
 }
 protected function getModel(){
  echo 'I am car';
 }
}

实例化后调用方法:

$car = new Car();
$car->model(); // 输出:I am car

关键字self使得我们调用了Car类的getModel()方法,输出了文本“I am car”。

2、添加一个新类作为Car类的子类:

class Mercedes extends Car
{
 protected function getModel()
 {
  echo "I am mercedes";
 }
}
// 实例化后 调用model()方法
$mercedes = new Mercedes();
$mercedes->model();

我们知道子类会继承父类的方法,我们在子类Mercedes中重写了getModel()方法。
这时候实例化Mercedes类调用model()方法,会输出字符串"I am car" 还是“I am mercedes”?

你可能会觉得结果是:I am mercedes。

但实际输出是:

I am car

why?

3、关键字self的工作原理是:它会调用当前类的方法

因为model()方法只在Car类中定义的,所以对self来说当前类就是Car类。self::getModel()就是调用Car类中的getModel方法。

这似乎不是我们想要的,如何解决呢?

4、解决方案一:在Mercedes类中覆盖model()方法

class Mercedes extends Car
{
 public function model(){
  //这里我们使用了关键字self
  self::getModel();
 }
 protected function getModel()
 {
  echo "I am mercedes";
 }
}
// 实例化后 调用model()方法
$mercedes = new Mercedes();
$mercedes->model(); // 输出:I am mercedes

但这肯定不是好办法啊,方法都重写了,还继承个毛啊。

5、解决方案二:把self关键字换成static

class Car{
 public function model(){
  //这里我们使用了关键字static
  static::getModel();
 }
 protected function getModel(){
  echo 'I am car';
 }
}

我们只是将Car类中的self替换成了static,并未对Mercedes类作修改。

此时我们调用:

$mercedes = new Mercedes();
$mercedes->model(); // 输出:I am mercedes

6、小结

在php5.3中加入了一个新特性,叫做延迟静态绑定。可以帮我们实现多态

简单说,延迟静态绑定意味着,当我们使用static关键字调用一个继承方法时,它将在运行时才绑定调用类

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
ftp类(example.php)
Oct 09 PHP
真正的ZIP文件操作类(php)
Jul 21 PHP
写php分页时出现的Fatal error的解决方法
Apr 18 PHP
php中利用post传递字符串重定向的实现代码
Apr 21 PHP
php cli 小技巧
Jun 03 PHP
PHP在线生成二维码(google api)的实现代码详解
Jun 04 PHP
深入PHP获取随机数字和字母的方法详解
Jun 06 PHP
在Yii框架中使用PHP模板引擎Twig的例子
Jun 13 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
Jul 04 PHP
搭建基于Docker的PHP开发环境的详细教程
Jul 01 PHP
分享50个提高PHP执行效率的技巧
Dec 26 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 #PHP
PHP常见过waf webshell以及最简单的检测方法
May 21 #PHP
PHP __call()方法实现委托示例
May 20 #PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 #PHP
PHP常量define和const的区别详解
May 18 #PHP
thinkphp5框架实现的自定义扩展类操作示例
May 16 #PHP
java解析json方法总结
May 16 #PHP
You might like
用php过滤危险html代码的函数
2008/07/22 PHP
在JavaScript中调用php程序
2009/03/09 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
php 解压rar文件及zip文件的方法
2014/05/05 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
JavaScript Event学习第十一章 按键的检测
2010/02/10 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
2014/04/08 Javascript
手机号码,密码正则验证
2014/09/04 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
2016/05/05 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
node.js实现快速截图
2016/08/27 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
浅谈javascript alert和confirm的美化
2016/12/15 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
微信小程序 自定义复选框实现代码实例
2019/09/04 Javascript
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
在Python中操作字典之update()方法的使用
2015/05/22 Python
python 美化输出信息的实例
2018/10/15 Python
使用python3构建文件传输的方法
2019/02/13 Python
python文件转为exe文件的方法及用法详解
2019/07/08 Python
浅谈Python的方法解析顺序(MRO)
2020/03/05 Python
Python request中文乱码问题解决方案
2020/09/17 Python
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
清明节扫墓活动方案
2014/03/02 职场文书
毕业生自荐信格式
2014/03/07 职场文书
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
2014年语文教学工作总结
2014/12/17 职场文书
Python利器openpyxl之操作excel表格
2021/04/17 Python
如何利用pygame实现打飞机小游戏
2021/05/30 Python
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫