什么叫前期动态绑定呢?其实咱们在之前的文章PHP中的static中曾经说过这个货色了。明天咱们还是再次深刻的了解一下这个概念。

首先,咱们通过一段代码来引入前期动态绑定这一概念:

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

class A

{

public static function who()

{

echo __CLASS__, PHP_EOL;

}

public static function test()

{

self::who();

}

}

class B extends A

{

public static function who()

{

echo __CLASS__, PHP_EOL;

}

}

B::test(); // A

在这段代码中,咱们应用了self关键字,当应用B类调用test()静态方法时,self指向的是A类的who()办法,因而,输入的是A。别冲动,这是一般的动态绑定。self关键字调用的内容取决于它定义时所在的类。也就是说不管怎么继承,用哪个子类来调用test()办法,self关键字都会调用的是A类的who()办法。

而前期动态绑定呢?其实就有点像实例化的类对象,每个实例化的对象,调用的都是本身,而不是父类的属性办法。一般的动态调用可不是这样,然而事实中咱们又有这样的需要,就像实例化对象的调用形式一样来调用动态属性办法,这时,咱们就能够应用static关键字来实现前期动态绑定。

class C

{

public static function who()

{

echo __CLASS__, PHP_EOL;

}

public static function test()

{

static::who();

}

}

class D extends C

{

public static function who()

{

echo __CLASS__, PHP_EOL;

}

}

D::test(); // D

当应用static关键字后,这里D类调用的test()办法外部调用的who()就是D类本人了。

官网文档中的定义如下:

当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧局部);当进行非静态方法调用时,即为该对象所属的类。

该性能从语言外部角度思考被命名为“前期动态绑定”。“前期绑定”的意思是说,static:: 不再被解析为定义以后办法所在的类,而是在理论运行时计算的。也能够称之为“动态绑定”,因为它能够用于(但不限于)静态方法的调用。

除了self和static关键字外,咱们还有一个parent关键字,这个关键字的意义就很显著了,调用父类的动态内容。咱们同时用三个关键字一起来进行测试:

class E

{

public static function who()

{

echo __CLASS__, PHP_EOL;

}

public static function test()

{

self::who();

static::who();

}

}

class F extends E

{

public static function who()

{

echo __CLASS__, PHP_EOL;

}

}

class G extends F

{

public static function who()

{

parent::who();

echo __CLASS__, PHP_EOL;

}

}

G::test();

// E

// F

// G

最初,咱们再来看两个PHP的办法,一个是get_called_class()办法,用来获取以后调用的是哪个类。在静态方法中能够依据调用形式判断以后类是哪个类来进行其余的业务逻辑操作。另一个是forward_static_call()办法,用于静态方法的调用。

class H

{

public static function who()

{

echo __CLASS__ . ':' . join(',', func_get_args()), PHP_EOL;

}

public static function test()

{

echo get_called_class(), PHP_EOL;

forward_static_call('who', 'a', 'b'); // xxx:a,b

forward_static_call(['I', 'who'], 'c', 'd'); // I:c,d

forward_static_call_array(['H', 'who'], ['e', 'f']); // H:e,f

}

}

class I extends H

{

public static function who()

{

echo __CLASS__ . ':' . join(',', func_get_args()), PHP_EOL;

}

}

function who()

{

echo 'xxx:' . join(',', func_get_args()), PHP_EOL;

}

H::test(); // H

// xxx:a,b

// I:c,d

// H:e,f

I::test(); // I

// xxx:a,b

// I:c,d

// H:e,f

留神,如果forward_static_call()不指定类名的话,将调用全局的办法。forward_static_call_array()则是将参数应用数组进行传递。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/source/%E5%90%8E%E6%9C%9F%E9%9D%99%E6%80%81%E7%BB%91%E5%AE%9A%E5%9C%A8PHP%E4%B8%AD%E7%9A%84%E4%BD%BF%E7%94%A8.php

参考文档:

https://www.php.net/manual/zh/language.oop5.late-static-bindings.php

https://www.php.net/manual/zh/function.get-called-class.php

https://www.php.net/manual/zh/function.forward-static-call.php

各自媒体平台均可搜寻【硬核项目经理】

前期绑定 php,关于php:后期静态绑定在PHP中的使用相关推荐

  1. android ,动态布局 butterknife,与Butterknife绑定在android中动态添加视图

    如何绑定布局中存在的视图,该视图使用ButterKnife动态添加到父视图中. 我有一个LinearLayout说容器.我有一个自定义布局,其中包含两个按钮,将此布局称为子视图 在活动中,我将chil ...

  2. 前期绑定 vs 后期绑定

    即:变量的类型,在编译时就能够确定的就是前期绑定:变量的类型,在编译时无法准确确定,只有在运行时才能确定的变量类型,就是后期绑定. 转载于:https://www.cnblogs.com/JAVA-S ...

  3. C#前期绑定和后期绑定操作Excel-------实现简单打印功能

    1,前期绑定 前期绑定需要引用Microsoft.Office.Interop.Excel.dll,代码有提示功能,编写方便,且代码量小.但是和具体的office版本密切相关,不同版本的Excel可能 ...

  4. VB6的后期绑定和前期绑定

    1. 什么是后期绑定和前期绑定后期绑定 MSDN 6的定义如下: 后期绑定:若将一个变量声明为 As Object 或 As Variant(包括 As Form 或 As Control 的变量), ...

  5. 前期绑定 和 后期绑定

    thinking in java 读书笔记(感悟): 页码:P9 (想看书上怎么讲的.自行翻看 P9 页)写于:2018年3月29日19:22:14作者:淮左白衣 目录 目录 场景: 前期绑定 后期绑 ...

  6. postgresql 高可用 pacemaker + corosync 之二 setup vip-mas ,vip-sla 均绑定在 master

    os: ubuntu 16.04 db: postgresql 9.6.8 pacemaker: Pacemaker 1.1.14 Written by Andrew Beekhof corosync ...

  7. 【SpringMVC学习05】SpringMVC中的参数绑定总结——较乱后期准备加入 同一篇幅他人的参数绑定...

    众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在这一篇博文中,我将总结一下springm ...

  8. in的绑定 mysql_MySQL IN语句的PDO绑定值

    MySQL IN语句的PDO绑定值 我有一个PDO的问题,我很想在被它困扰很长一段时间后得到答案. 举个例子: 我将一个ID数组绑定到PDO语句,以便在MySQL IN语句中使用. 该数组将是:$ v ...

  9. transitionend、change、classList、兼容代码、元素样式属性的操作、-Attribute自定义属性、阻止跳转、元素绑定相同事件、元素解绑事件、事件冒泡、事件三阶段

    transitionend过渡监听事件: 过渡监听事件transitionend指的是CSS3中过渡效果执行一次后触发事件处理函数,如下案例: <!DOCTYPE html><htm ...

最新文章

  1. android webview重绘,Android-怎么判断android中WebView滑动到了低端
  2. Java 接口和抽象类可以被new么?——顺便总结内部类
  3. 第二章. node中的模块和require
  4. jsp中写隐藏td标签_28. Django 2.1.7 模板语言 变量、标签、过滤器、自定义过滤器、模板注释...
  5. autocad r14 win7补丁_AutoCAD R14几个实用补丁
  6. 看完《我的前半生》的些许感悟
  7. 简单好听的id_简单好听的微信id
  8. Android UI 基础知识
  9. 一个完整的NES模拟器
  10. globk平差输出选项含义
  11. 达林顿管,达林顿管原理
  12. BZOJ1707 : [Usaco2007 Nov]tanning分配防晒霜
  13. AgNCs-NIPAM-AAc温度响应性银纳米簇荧光探针
  14. 如何用3D流体实现逼真水流效果?
  15. mysql综合案例 数据表的基本操作
  16. wine安装迅雷、qq2009
  17. TCP数据发送之TSO/GSO
  18. C语言学习记录(三)——Switch、函数定义
  19. -bash: 无法为立即文档创建临时文件: 结构需要清理
  20. esp32/arduino使用snap7与SIMENS plc通信

热门文章

  1. Windows下安装Vim插件管理Vundle
  2. Dubbo-gok8s注册中心设计方案与实现
  3. sstableloader工具使用及原理解析
  4. 阿里AI再出神器,“你是什么垃圾”一拍便知
  5. MaxCompute 项目子账号做权限管理
  6. 用PyTorch创建一个图像分类器?So easy!(Part 1)
  7. 看完这些干货帖,大数据产品从入门到精通
  8. AliOS Things 电源管理框架使用说明
  9. 飞桨企业版重磅发布智能边缘控制台 5分钟零代码自动化模型部署
  10. Gartner:云安全的未来——中国的安全访问服务边缘架构