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 Cookie的使用教程详解
Jun 03 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
Jul 28 PHP
THINKPHP项目开发中的日志记录实例分析
Dec 01 PHP
PHP中让curl支持sock5的代码实例
Jan 21 PHP
php禁止某ip或ip地址段访问的方法
Feb 25 PHP
Yii使用Captcha验证码的方法
Dec 28 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
May 17 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
Jun 13 PHP
php自定义函数实现二维数组按指定key排序的方法
Sep 29 PHP
浅谈PHP中的面向对象OOP中的魔术方法
Jun 12 PHP
php语法检查的方法总结
Jan 21 PHP
Thinkphp 3.2框架使用Redis的方法详解
Oct 24 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
咖啡是不是喝了会上瘾?咖啡是必须品吗!
2021/03/04 新手入门
第五节--克隆
2006/11/16 PHP
php error_log 函数的使用
2009/04/13 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
JavaScript null和undefined区别分析
2009/10/14 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
jquery 设置style:display的方法
2015/01/29 Javascript
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
vue2.0实现前端星星评分功能组件实例代码
2018/02/12 Javascript
vue实现图片上传功能
2020/05/28 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
Flask框架的学习指南之用户登录管理
2016/11/20 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
python实现可逆简单的加密算法
2019/03/22 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
python ubplot使用方法解析
2020/01/10 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
总裁秘书岗位职责
2013/12/04 职场文书
军人离婚协议书样本
2014/10/21 职场文书
2014年协会工作总结
2014/11/22 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
Golang 结构体数据集合
2022/04/22 Golang