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写杨辉三角实例代码
Jul 17 PHP
php 模拟POST提交的2种方法详解
Jun 17 PHP
php删除左端与右端空格的方法
Nov 29 PHP
php实现mysql备份恢复分卷处理的方法
Dec 26 PHP
php中get_cfg_var()和ini_get()的用法及区别
Mar 04 PHP
24条货真价实的PHP代码优化技巧
Jul 28 PHP
PHP页面跳转操作实例分析(header方法)
Sep 28 PHP
PHP实现多级分类生成树的方法示例
Feb 07 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
Aug 15 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
Apr 20 PHP
PHP实现转盘抽奖算法分享
Apr 15 PHP
PHP命令Command模式用法实例分析
Aug 08 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
星际争霸 Starcraft 编年史
2020/03/14 星际争霸
收音机术语解释
2021/03/01 无线电
php连接数据库代码应用分析
2011/05/29 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
PHP curl批处理及多请求并发实现方法分析
2018/08/15 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
JS 字符串连接[性能比较]
2009/05/10 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
react.js 获取真实的DOM节点实例(必看)
2017/04/17 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
ES6数组的扩展详解
2017/04/25 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
Vue+Webpack完美整合富文本编辑器TinyMce的方法
2018/11/30 Javascript
Python中的zipfile模块使用详解
2015/06/25 Python
Django框架之中间件MiddleWare的实现
2019/12/30 Python
利用Python脚本批量生成SQL语句
2020/03/04 Python
解决python使用list()时总是报错的问题
2020/05/05 Python
聊聊python中的循环遍历
2020/09/07 Python
python实现KNN近邻算法
2020/12/30 Python
pycharm 快速解决python代码冲突的问题
2021/01/15 Python
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
美国山地自行车、露营、户外装备和服装购物网站:Aventuron
2018/05/05 全球购物
文案策划求职信
2014/04/14 职场文书
入党介绍人评语
2014/05/06 职场文书
环境保护建议书
2014/08/26 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python
python自动化测试之Selenium详解
2022/03/13 Python