简单谈谈php延迟静态绑定


Posted in PHP onJanuary 26, 2016

使用场景

先来观察以下代码:

abstract class base {
  //do sth
}
class aClass extends base{
  public static function create(){
    return new aClass();
  } 
}
class bClass extends base{
  public static function create(){
    return new bClass();
  }
}
var_dump(aClass::create());
var_dump(bClass::create());

输出:

object(aClass)#1 (0) { } object(bClass)#1 (0) { }

以上aClass和bClass继承于base这个抽象类,但是在两个子类中同时实现了create()这个静态方法。遵从oop思想,这种重复代码应该放在base这个父类中实现。

改进代码

abstract class base {
  public static function create(){
    return new self();
  } 
}
class aClass extends base{
}
class bClass extends base{
}
var_dump(aClass::create());
var_dump(bClass::create());

现在的代码看起来好像已经符合我们之前的想法,将create()方法放在父类里共用了,那我们来运行下看会发生什么。

Cannot instantiate abstract class base in ...

很遗憾,代码好像并没有按照我们预想的那样去运行,父类中的self()被解析为base这个父类,并非继承与他的子类。于是为了解决这个问题,php5.3中引入了延迟静态绑定这个概念。

延迟静态绑定

abstract class base {
  public static function create(){
    return new static();
  } 
}
class aClass extends base{
}
class bClass extends base{
}
var_dump(aClass::create());
var_dump(bClass::create());

这个代码与之前的几乎一致,不同点在于将self换成了static这个关键字,static会解析为子类,而非父类,这样就可以解决上面遇到的问题,这就是php的延迟静态绑定。

最后,运行一下代码,得到了最终想要的结果。

object(aClass)#1 (0) { } object(bClass)#1 (0) { }
PHP 相关文章推荐
PHP编程网上资源导航
Oct 09 PHP
用Php实现链结人气统计
Oct 09 PHP
php上传图片到指定位置路径保存到数据库的具体实现
Dec 30 PHP
php分页代码学习示例分享
Feb 20 PHP
php使用类继承解决代码重复的问题
Feb 11 PHP
php使用NumberFormatter格式化货币的方法
Mar 21 PHP
php把数组值转换成键的方法
Jul 13 PHP
PHP接收App端发送文件流的方法
Sep 23 PHP
php layui实现前端多图上传实例
Jul 30 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
Apr 13 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
Oct 30 PHP
PHP mkdir创建文件夹实现方法解析
Nov 13 PHP
php制作的简单验证码识别代码
Jan 26 #PHP
php文档工具PHP Documentor安装与使用方法
Jan 25 #PHP
PHP代码维护,重构变困难的4种原因分析
Jan 25 #PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
Jan 25 #PHP
PHP实现的oracle分页函数实例
Jan 25 #PHP
PHP设置头信息及取得返回头信息的方法
Jan 25 #PHP
基于命令行执行带参数的php脚本并取得参数的方法
Jan 25 #PHP
You might like
php skymvc 一款轻量、简单的php
2011/06/28 PHP
php+mysqli批量查询多张表数据的方法
2015/01/29 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
各式各样的导航条效果css3结合jquery代码实现
2016/09/17 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
详解使用nvm安装node.js
2017/07/18 Javascript
详解jQuery中的easyui
2018/09/02 jQuery
使用elementUI实现将图片上传到本地的示例
2018/09/04 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
Vue实现购物车详情页面的方法
2019/08/20 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
[00:12]DAC2018 天才少年转战三号位,他的SOLO是否仍如昔日般强大?
2018/04/06 DOTA
Python 字典(Dictionary)操作详解
2014/03/11 Python
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
Python fileinput模块使用实例
2015/06/03 Python
Python操作配置文件ini的三种方法讲解
2019/02/22 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
关于pytorch处理类别不平衡的问题
2019/12/31 Python
浅析python实现动态规划背包问题
2020/12/31 Python
3个CCIE对一个工程师的面试题
2012/05/06 面试题
社团文化节邀请函
2014/01/10 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
职工擅自离岗检讨书
2014/09/23 职场文书
运动会闭幕式主持词
2015/07/01 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
Django Paginator分页器的使用示例
2021/06/23 Python
golang操作rocketmq的示例代码
2022/04/06 Golang