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 相关文章推荐
比较简单实用的PHP无限分类源码分享(思路不错)
Oct 13 PHP
深入file_get_contents函数抓取内容失败的原因分析
Jun 25 PHP
smarty实现多级分类的方法
Dec 05 PHP
php获取QQ头像并显示的方法
Dec 23 PHP
Composer设置忽略版本匹配的方法
Apr 27 PHP
php简单实现数组分页的方法
Apr 30 PHP
Yii2中使用join、joinwith多表关联查询
Jun 30 PHP
Laravel 5.3 学习笔记之 错误&日志
Aug 28 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
Sep 12 PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 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图片缩放实现方法
2014/02/20 PHP
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
Zend Framework教程之Zend_Registry对象用法分析
2016/03/22 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
php实现多站点共用session实现单点登录的方法详解
2019/09/18 PHP
JAVASCRIPT下判断IE与FF的比较简单的方式
2008/10/17 Javascript
JS中如何设置readOnly的值
2013/12/25 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
JS多个表单数据提交下的serialize()应用实例分析
2019/08/27 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
详解vue 组件
2020/06/11 Javascript
原生js实现拖拽移动与缩放效果
2020/08/24 Javascript
Python实现的简单模板引擎功能示例
2017/09/02 Python
用python制作游戏外挂
2018/01/04 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
2019/02/12 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
python使用递归的方式建立二叉树
2019/07/03 Python
通过实例解析Python return运行原理
2020/03/04 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
解决导入django_filters不成功问题No module named 'django_filter'
2020/07/15 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
澳大利亚巧克力花束和礼品网站:Tastebuds
2019/03/15 全球购物
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
英语专业毕业生自荐信范文
2013/12/31 职场文书
前台文员职责范本
2014/03/07 职场文书
作文评语集锦大全
2014/04/23 职场文书
职工小家建设活动方案
2014/08/25 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
学术会议开幕词
2016/03/03 职场文书
导游词之江南周庄
2019/12/06 职场文书
Feign调用传输文件异常的解决
2021/06/24 Java/Android
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python