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入门速成教程
Mar 19 PHP
php 设计模式之 工厂模式
Dec 19 PHP
php smarty函数扩展
Mar 15 PHP
php文档更新介绍
Jul 22 PHP
Fine Uploader文件上传组件应用介绍
Jan 06 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
Aug 09 PHP
PHP mysql与mysqli事务使用说明 分享
Aug 17 PHP
PHP源码分析之变量的存储过程分解
Jul 03 PHP
PHP代码优化技巧小结
Sep 29 PHP
PHP创建自己的Composer包方法
Apr 09 PHP
php使用curl获取header检测开启GZip压缩的方法
Aug 15 PHP
php服务器的系统详解
Oct 12 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
.htaccess文件保护实例讲解
2011/02/06 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
php获取数组长度的方法(有实例)
2013/10/27 PHP
PHP实现的下载远程图片自定义函数分享
2015/01/28 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
详解PHP对数组的定义以及数组的创建方法
2015/11/27 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
2013/11/25 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
js中小数转换整数的方法
2014/01/26 Javascript
JavaScript原生对象之String对象的属性和方法详解
2015/03/13 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
js实现加载页面就自动触发超链接的示例
2017/08/31 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
生产制造追溯系统之在线打印功能
2019/06/03 Javascript
python字符串,数值计算
2016/10/05 Python
python使用sqlite3时游标使用方法
2018/03/13 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
2020/08/07 Python
如何让IE9以下版本(ie6/7/8)认识html5元素
2013/04/01 HTML / CSS
【HTML5】Canvas绘制简单图片教程
2016/05/13 HTML / CSS
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
电子工程专业毕业生求职信
2014/03/14 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
2015年酒店前台工作总结
2015/04/20 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
清明扫墓感想
2015/08/11 职场文书
导游词之桂林
2019/08/20 职场文书