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实现像JSP,ASP里Application那样的全局变量
Jan 12 PHP
PHP开发的一些注意点总结
Oct 12 PHP
php中转义mysql语句的实现代码
Jun 24 PHP
PHP 函数call_user_func和call_user_func_array用法详解
Mar 02 PHP
php将字符串转化成date存入数据库的两种方式
Apr 28 PHP
php写入数据到CSV文件的方法
Mar 14 PHP
php实现微信发红包
Dec 05 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
Dec 23 PHP
php+resumablejs实现的分块上传 断点续传功能示例
Apr 18 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
Laravel用户授权系统的使用方法示例
Sep 16 PHP
使用composer命令加载vendor中的第三方类库 的方法
Jul 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
PHP实现git部署的方法教程
2017/12/19 PHP
jQuery 动态云标签插件
2014/11/11 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
Vuejs 页面的区域化与组件封装的实现
2017/09/11 Javascript
bootstrap fileinput插件实现预览上传照片功能
2018/01/23 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
2018/08/01 Javascript
AngularJS与后端php的数据交互方法
2018/08/13 Javascript
web页面和微信小程序页面实现瀑布流效果
2018/09/26 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
vue中使用codemirror的实例详解
2018/11/01 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
JS基于开关思想实现的数组去重功能【案例】
2019/02/18 Javascript
解决removeEventListener 无法清除监听的问题
2020/10/30 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
Python基于有道实现英汉字典功能
2015/07/25 Python
Python中enumerate函数代码解析
2017/10/31 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
python使用matplotlib画柱状图、散点图
2019/03/18 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
HTML5页面音视频在微信和app下自动播放的实现方法
2016/10/20 HTML / CSS
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
结婚喜宴家长答谢词
2014/01/15 职场文书
学生干部学习的自我评价
2014/02/18 职场文书
化学系大学生自荐信范文
2014/03/01 职场文书
售房委托书
2014/08/30 职场文书
财务总监岗位职责
2015/02/03 职场文书
居住证明范文
2015/06/17 职场文书
2015年幼儿园班主任个人工作总结
2015/10/22 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
解决numpy数组互换两行及赋值的问题
2021/04/17 Python