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 相关文章推荐
桌面中心(三)修改数据库
Oct 09 PHP
ADODB结合SMARTY使用~超级强
Nov 25 PHP
一些常用的php函数
Dec 06 PHP
php面向对象全攻略 (十) final static const关键字的使用
Sep 30 PHP
PHP的博客ping服务代码
Feb 04 PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
Sep 05 PHP
CodeIgniter基本配置详细介绍
Nov 12 PHP
WordPress自定义时间显示格式
Mar 27 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
Dec 10 PHP
Joomla框架实现字符串截取的方法示例
Jul 18 PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 PHP
PHP大文件分割分片上传实现代码
Dec 09 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
Apache设置虚拟WEB
2006/10/09 PHP
PHP 和 MySQL 基础教程(二)
2006/10/09 PHP
用php和MySql来与ODBC数据连接
2006/10/09 PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
2011/11/02 PHP
Add a Table to a Word Document
2007/06/15 Javascript
用户注册常用javascript代码
2009/08/29 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
基于js与flash实现的网站flv视频播放插件代码
2014/10/14 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
老生常谈JavaScript 正则表达式语法
2016/08/20 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
基于Nodejs的Tcp封包和解包的理解
2018/09/19 NodeJs
微信小程序获取地理位置及经纬度授权代码实例
2019/09/18 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
[02:06]DOTA2肉山黑名单魔法终结者 敌法师中文配音鉴赏
2013/06/17 DOTA
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
python中requests小技巧
2017/05/10 Python
python中join()方法介绍
2018/10/11 Python
django主动抛出403异常的方法详解
2019/01/04 Python
Django项目之Elasticsearch搜索引擎的实例
2019/08/21 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
python 动态渲染 mysql 配置文件的示例
2020/11/20 Python
python 通过exifread读取照片信息
2020/12/24 Python
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
芬兰汽车配件商店:Autonvaraosat24
2017/01/30 全球购物
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
党员教师工作决心书
2014/03/13 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书