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 相关文章推荐
windows xp下安装pear
Dec 02 PHP
php 向访客和爬虫显示不同的内容
Nov 09 PHP
PHP 验证码的实现代码
Jul 17 PHP
php遍历文件夹所有文件子文件夹函数代码
Nov 27 PHP
php读取目录所有文件信息dir示例
Mar 18 PHP
php使用json_encode对变量json编码
Apr 07 PHP
PHP防范SQL注入的具体方法详解(测试通过)
May 09 PHP
Yii结合CKEditor实现图片上传功能
Jun 13 PHP
帝国cms目录结构分享
Jul 06 PHP
php版微信公众平台开发之验证步骤实例详解
Sep 23 PHP
CI框架表单验证实例详解
Nov 21 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 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脚本的10个技巧(8)
2006/10/09 PHP
php中变量及部分适用方法
2008/03/27 PHP
PHP图片上传代码
2013/11/04 PHP
PHP中的替代语法简介
2014/08/22 PHP
php采集神器cURL使用方法详解
2016/02/19 PHP
PHP与Ajax相结合实现登录验证小Demo
2016/03/16 PHP
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
node.js中的console.time方法使用说明
2014/12/09 Javascript
详解Angularjs filter过滤器
2016/02/06 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
基于jQuery实现滚动切换效果
2016/12/02 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
2016/12/03 Javascript
原生JS实现圣旨卷轴展开效果
2017/03/06 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
2018/05/28 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
[46:14]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python列表操作实例
2015/01/14 Python
python将图片文件转换成base64编码的方法
2015/03/14 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
Sanic框架请求与响应实例分析
2018/07/16 Python
python画图常规设置方式
2020/03/05 Python
python 成功引入包但无法正常调用的解决
2020/03/09 Python
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
中专毕业自我鉴定
2013/10/16 职场文书
计算机专业学生求职信分享
2013/12/15 职场文书
校园报刊亭创业计划书
2014/01/02 职场文书
护士进修自我鉴定
2014/02/07 职场文书
关于建议书的格式范文
2014/05/20 职场文书
2014年技术工作总结范文
2014/11/20 职场文书
邀请书模板
2015/02/02 职场文书
《暗黑破坏神2:重制版》本周进行第一轮A测 目前可官网进行申请报名
2021/04/07 其他游戏
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle