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-MySQL教程归纳总结
Jun 07 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
php实现多张图片上传加水印技巧
Apr 18 PHP
PHP四舍五入精确小数位及取整
Jan 14 PHP
php使用iconv中文截断问题的解决方法
Feb 11 PHP
php生成不重复随机数、数组的4种方法分享
Mar 30 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
Sep 22 PHP
PHP常用字符串函数小结(推荐)
Aug 05 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
May 05 PHP
ThinkPHP3.2框架操作Redis的方法分析
May 05 PHP
Yii2框架中一些折磨人的坑
Dec 15 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 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
隐藏你的.php文件的实现方法
2007/03/19 PHP
php实现根据字符串生成对应数组的方法
2014/09/22 PHP
PHP常用技巧汇总
2016/03/04 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
jQuery学习5 jQuery事件模型
2010/02/07 Javascript
jquery 插件学习(五)
2012/08/06 Javascript
jquery实现metro效果示例代码
2013/09/06 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
深入理解JavaScript定时机制
2016/10/27 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
JS实现获取进今年第几天是周几的方法分析
2018/06/27 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
通过实例学习React中事件节流防抖
2019/06/17 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
Python中super的用法实例
2015/05/28 Python
python+matplotlib绘制旋转椭圆实例代码
2018/01/12 Python
Python实现的生成格雷码功能示例
2018/01/24 Python
PyQt实现界面翻转切换效果
2018/04/20 Python
Python基础教程之异常详解
2019/01/10 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
python爬虫实现中英翻译词典
2019/06/25 Python
Django 响应数据response的返回源码详解
2019/08/06 Python
Python Web框架之Django框架文件上传功能详解
2019/08/16 Python
python线程优先级队列知识点总结
2021/02/28 Python
中国网上药店领导者:1药网
2017/02/16 全球购物
GetYourGuide台湾:预订旅游活动、景点和旅游项目
2019/06/10 全球购物
公司踏青活动方案
2014/08/16 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
大学生受助感言
2015/08/01 职场文书
MySQL中varchar和char类型的区别
2021/11/17 MySQL
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
2022/08/05 Vue.js