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

什么叫前期动态绑定呢?其实咱们在之前的文章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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

原来,阿里工程师才是隐藏的“修图高手”!

阿里妹导读:在现实世界中,信息通常以不同的模态同时出现。这里提到的模态主要指信息的来源或者形式。例如在淘宝场景中,每个商品通常包含标题、商品短视频、主图、附图、各种商品属性(类目,价格,销量&#…

分布式数据集训营,从入门到精通,从理论到实践,你不可错过的精品课程!...

责编 | Carol出品 | CSDN云计算(ID:CSDNcloud)随着微服务、云化架构的兴起,分布式数据库开始在越来越多的场景得到应用,从外围系统到中台业务,再到核心交易业务,分布式数据库成为企业基础架构转…

mybatis批量插入10万条数据的优化过程

在使用mybatis插入大量数据的时候,为了提高效率,放弃循环插入,改为批量插入,mapper如下: package com.lcy.service.mapper;import com.lcy.service.pojo.TestVO; import org.apache.ibatis.annotations.Insert;import java.util.List;/*** 功能描述:** author liuc…

java spring注解维护,从一次工程启动失败谈谈 spring 注解

原标题:从一次工程启动失败谈谈 spring 注解檀宝权Java 后端开发工程师,负责度假 App 后端和广告后端开发维护工作,熟悉 Tomcat,Spring,Mybatis,会点 Python,Lua。一、背景线上环境升级成 JDK8后…

探索Java日志的奥秘:底层日志系统-log4j2

前言 log4j2是apache在log4j的基础上,参考logback架构实现的一套新的日志系统(我感觉是apache害怕logback了)。 log4j2的官方文档上写着一些它的优点: 在拥有全部logback特性的情况下,还修复了一些隐藏问题API 分离&…

大地震!某大厂“硬核”抢人,放话:只要AI人才,高中毕业都行!

特斯拉创始人马斯克,在2019年曾许下很多承诺,其中一个就是:2019年底实现完全的自动驾驶。虽然这个承诺又成了flag,但是不妨碍他今年继续为这个承诺努力。这不,就在上周一,马斯克之间在twitter上放话了&…

解决Maven打包(编译)慢的问题

终于找到Maven打包(编译)慢的原因了,lombok是罪魁祸首 一个独立的Model包,560个实体类,编译要4分钟,而老项目2100多个类,编译才要10多秒 开始以为是Swagger注解的原因,最后经常测试 swagger注解只用了2-3…

Dart编译技术在服务端的探索和应用

前言 最近闲鱼技术团队在FlutterDart的多端一体化的基础上,实现了FaaS研发模式。Dart吸取了其它高级语言设计的精华,例如Smalltalk的Image技术、JVM的HotSpot和Dart编译技术又师出同门。由Dart实现的语言容器,它可以在启动速度、运行性能有不…

mysql 取最后一次登陆,获得最后一次插入mysql的id | 学步园

最近两天一直忙着通过数据库访问数据记录,然后做操作。以前我在数据库中插入记录后,就要去做别的操作,别的操作也是先访问存在数据库中的记录,然后完成操作。所以我通过记录的名字来访问记录的,原来想过通过id来访问数…

Python + ElasticSearch:有了这个超级武器,你也可以报名参加诗词大会了! | 博文精选...

来源 | CSDN 博客作者 | 天元浪子责编 | Carol出品 | CSDN云计算(ID:CSDNcloud)意犹未尽的诗词大会正月十六,中国诗词大会第五季落下帷幕。从2016年2月12日第一季于开播,迄今恰好四周年。在这个舞台上,时年…

Node.js 应用故障排查手册 —— 大纲与常规问题指标简介

楔子 你是否想要尝试进行 Node.js 应用开发但是又总听人说它不安全、稳定性差,想在公司推广扩张大前端的能力范畴和影响又说服不了技术领导。 JavaScript 发展到今天,早已脱离原本浏览器的战场,借助于 Node.js 的诞生将其触角伸到了服务端、P…

mybatis批量插入oracle大量数据记录性能问题解决

环境: mybatis oracle11g r2 1.使用"直接路径插入"(下面sql语句中的"/*append_values */"),并且使用关键字"union all": <insert id"addUidCodeBatch" parameterType"java.util.List"> insert into /*append_val…

蚂蚁金服CTO程立:做工程要有“拧螺丝”的精神

“一台机器可能有无数颗螺丝&#xff0c;需要一个一个地拧&#xff0c;而且需要一圈一圈地拧&#xff0c;才能让系统间严丝合缝&#xff0c;顺利工作。代码的世界里&#xff0c;一个项目到底成功与否&#xff0c;也是取决于几个模型的关键特殊设置&#xff0c;就像拧螺丝一样。…

php asciii 回车换行,ubuntu下关于telnet俩个特殊ascii字符回车0x0d与换行0x0a

服务器与telnet客户端通信当服务器仅返回输入内容时$connection->send($res)。Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is ^].kkkk▌光标紧跟着服务器发送内容的后面。当服务器发送0x0a或0x0d0a或0x0a0d时&#xff0c;$connection->send($res.chr(0…

更效率、更优雅 | 阿里巴巴开发者工具不完全盘点

从人工到自动化&#xff0c;从重复到创新&#xff0c;技术演进的历程中&#xff0c;伴随着开发者工具类产品的发展。 阿里巴巴将自身在各类业务场景下的技术积淀&#xff0c;通过开源、云上实现或工具等形式对外开放&#xff0c;本文将精选了一些阿里巴巴的开发者工具&#xf…

linux 环境安装DBI和DBD_03

文章目录一、软件下载二、安装DBI2.1. DBI下载2.2. 解压2.3. 安装依赖2.4. 编译2.5. 执行测试2.6. 安装2.6. 修改权限三、安装DBD-ORACLE组件3.1. DBI下载3.2. 修改权限3.3. 切换用户3.4. 解压3.5. 进入目录3.6. 初始化环境变量3.6. 查看配置的环境变量是否配置3.7. 刷新配置文…

php+反序列化方法,PHP序列化反序列化的方法详解

在一些开源的php源代码中&#xff0c;我们经常看到一些配置文件里面存放的是一些类似带有格式的变量名称和值。刚开始还不明白这个是怎么回事儿。后来才知道这个是为了将一个复杂(也可能并不那么复杂)的数据结构转换成一个字符串&#xff0c;以便于保存和传递。其实就是一个序列…

像数据科学家一样思考:12步指南(上)

介绍 目前&#xff0c;数据科学家正在受到很多关注&#xff0c;因此&#xff0c;有关数据科学的书籍正在激增。我看过很多关于数据科学的书籍&#xff0c;在我看来他们中的大多数更关注工具和技术&#xff0c;而不是数据科学中细微问题的解决。直到我遇到Brian Godsey的“像数…

Mybatis-plus 大数据量数据流式查询通用接口

文章目录一、案例需求二、使用案例&#xff1a;2.1. 自定义查询接口2.2. 逻辑处理类2.3. 调用案例2.4. 具体逻辑处理案例三、企业案例3.1. key名称获取3.2. 逻辑类测试3.3.最后一个批次处理方案四、 通用SQL预编译处理4.1. 业务场景4.2. xml形式4.3. 注解形式五、企业案例5.1. …

基于MaxCompute的数仓数据质量管理

声明 本文中介绍的非功能性规范均为建议性规范&#xff0c;产品功能无强制&#xff0c;仅供指导。 参考文献 《大数据之路——阿里巴巴大数据实践》——阿里巴巴数据技术及产品部 著。 背景及目的 数据对一个企业来说已经是一项重要的资产&#xff0c;既然是资产&#xff…