首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

php静态延迟方法,phpstatic延迟静态绑定_PHP教程

他指的是解析上下文,因此如果运行上面的列子,将会得到 Fatal error: Cannot instantiate abstract class U in D:\wamp\www\test\oop\static.php...php5.3之前,在这方面都有严格的限制,产生过很多笨拙的解决方案,php5.3引入了延迟静态绑定 及使用 关键字 static static类似self,但它指的是被调用的类而不是包含类。...} class u1 extends U{ } class u2 extends U{ } u1::create(); static不仅可以用于实例化,和self,parent一样还可以作为静态方法的调用标识符...,甚至是从非静态上下文中调用 abstract class U{ private $group; public function __construct(){ $this->group=static...static function create(){ return new u1(); } } class u2 e… 本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉 本文系统来源:php

1K10
您找到你想要的搜索结果了吗?
是的
没有找到

理解PHP延迟静态绑定

使用(static)关键字来表示这个别名,和静态方法,静态类没有半毛钱的关系,static::不仅支持静态类,还支持对象(动态类)。...转发调用 所谓的“转发调用”(forwarding call)指的是通过以下几种方式进行的静态调用:self::,parent::,static:: 以及 forward_static_call()。...非转发调用 那么非转发调用其实就是明确指定类名的静态调用(foo::bar())和非静态调用($foo->bar()) 后期静态绑定原理 后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding...who() { echo __CLASS__; } public static function test() { static::who(); // 后期静态绑定从这里开始...\n"; } } C::test(); 输出: A C C 分析:运行C::test()会调用C继承自B的test方法,这个方法中首先执行的是A中的foo方法,此时属于静态方法调用,static

1.2K20

PHP延迟静态绑定的深入讲解

前言 所谓延迟静态绑定,顾名思义,静态调用时::符号左侧的部分的的绑定延迟,也就是说不再被解析为定义当前方法所在的类,而是在实际运行时计算的。...本文主要介绍了关于PHP延迟静态绑定的相关内容,下面话不多说了,来一起看看详细的介绍吧。 嗅到了坏的味道 这段时间看项目后台的PHP代码,看到了类似于以下的一段代码,我把它抽出来: <?...这就需要说到今天的重点了————延迟静态绑定延迟静态绑定PHP5.3以后引入了延迟静态绑定。再看下面这段代码: <?...这就是后期静态绑定的根本————static关键字的另类用法。...对于文章一开始的例子,可以这么改: return new static(); // 改变这里,后期静态绑定 这种使用后期静态绑定,在使用PHP实现23中设计模式的时候,你会感到很轻松的。

58620

PHP静态延迟绑定和普通静态效率的对比

PHP静态延迟绑定和普通静态效率的对比 只是一个简单的小实验,对比了下 延迟绑定 和 非延迟的效率 延迟绑定主要就是使用 static 关键字来替代原来的 self ,但功能非常强大了 实验代码: class...() { return self::$cc4; } public static function n5() { return self::$cc5; } } 上面总共 A 、B 、C 三个类,里面全是静态成员变量和方法...,其中 A 类是使用了静态延迟, B 类是非延迟, C 类是继承A类实现了静态成员变量和方法的延迟绑定。...过程也不多说了,环境是 PHP5.4.27 直接上测试结果: 有两种情况, 当只有 A、B类(也就是不让任何类继承A类)时,效率上几乎没有差别的 当A类被C类继承了之后,使用静态延迟绑定的A类性能将会比...,重载的越多则速度和 B 类(非延迟)就越接近,但 A 类的速度仍然会比 B 类 和 C 类慢

60830

PHP后期静态绑定

在看到后期静态绑定这个词的时候,感觉挺官方的,不太好理解,这里为我权当做个笔记了 即在类的继承过程中,使用的类不再是继承的类.而是调用的类,通过static关键字来实现,"static"不在被解析定义为当前方法所在的类...,而是在实际运行时计算得到的,即为运行时最初调用的类,虽然称为后期静态绑定 但是并不局限于静态方法的调用 class A { public static function call()...self::"是直接调用的本类中的方法,而static是根据调用test()函数的类来决定"static::"的值,因此static的值只有在调用时才能确定下来.这里需要注意的是,static并不限于静态方法的调用...,它同样适用于非静态方法,调用的方式如上一致,是在调用时动态确定的,下面给出例子 class A { public function call() { echo "instance

91810

PHP后期静态绑定实例浅析

本文实例讲述了PHP后期静态绑定。...分享给大家供大家参考,具体如下: 从php5.3开始,php增加了一个叫后期绑定的功能,用于在继承范围内引用静态调用的类 该功能从语言内部角度考虑北命名为“后期静态绑定”;“后期绑定”意思说:static...::不再被解析为定义当前方法所在的类,而是在实际运行时计算的,也可以成为“静态绑定”;因为他可以用于(但不限于静态方法的调用)。...后期静态绑定试图通过引入一个关键字表示运行时最初调用的类来绕过限制。...打印结果是: B 后期静态绑定的处理方式解决了以往完全没有解决的静态调用,另外一方面,如果静态调用使用parent::或者self::将转发调用信息 <?

67931

延迟绑定

动态链接的确有很多优势,比静态链接要灵活得多,但它是以牺牲一部分性能为代价的。据统计ELF程序在静态链接下要比动态库稍微快点,大约为1%~5%,当然这取决于程序本身的特性及运行环境等。...延迟绑定实现 在动态链接下,程序模块之间包含了大量的函数引用(全局变量往往比较少,因为大量的全局变量会导致模块之间耦合度变大),所以在程序开始执行前,动态链接会耗费不少时间用于解决模块之间的函数引用的符号查找以及重定位...所以ELF采用了一种叫做延迟绑定(Lazy Binding)的做法,基本的思想就是当函数第一次被用到时才进行绑定(符号査找、重定位等),如果没有用到则不进行绑定。...PLT为了实现延迟绑定,在这个过程中间又增加了一层间接跳转。调用函数并不直接通过GOT跳转,而是通过一个叫做PLT项的结构来进行跳转。...如果链接器在初始化阶段已经初始化该项,并且将bar()的地址填入该项,那么这个跳转指令的结果就是我们所期望的,跳转到bar(0,实现函数正确调用但是为了实现延迟绑定,链接器在初始化阶段并没有将bar()

1.1K20

后期静态绑定PHP中的使用

后期静态绑定PHP中的使用 什么叫后期静态绑定呢?其实我们在之前的文章PHP中的static中已经说过这个东西了。今天我们还是再次深入的理解一下这个概念。...首先,我们通过一段代码来引入后期静态绑定这一概念: class A { public static function who() { echo __CLASS__, PHP_EOL...别激动,这是普通的静态绑定。self关键字调用的内容取决于它定义时所在的类。也就是说不管怎么继承,用哪个子类来调用test()方法,self关键字都会调用的是A类的who()方法。 而后期静态绑定呢?...普通的静态调用可不是这样,但是现实中我们又有这样的需求,就像实例化对象的调用方式一样来调用静态属性方法,这时,我们就可以使用static关键字来实现后期静态绑定。...“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。

67910

PHP后期静态绑定之self::限制实例分析

本文实例讲述了PHP后期静态绑定之self::限制。分享给大家供大家参考,具体如下: 在此我想讲一讲后期静态绑,我想讲self::与static进行比较说明。...官方文档上是这样定义的: “后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为”静态绑定”,因为它可以用于(但不限于)静态方法的调用。...(不可以指向非静态变量),但是可以访问类中其他静态方法与非静态方法。...但也可以访问父类的其他方法(不可以访问其他静态与非静态变量)。 static:: 通常用于后期静态绑定中。...更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串

63631

动态绑定静态绑定

为了支持c++的多态性,才用了动态绑定静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误。 需要理解四个名词: 1、对象的静态类型:对象在声明时采用的类型。...的类型D* 12 C* pC = new C(); 13 pB = pC;//pB的动态类型是可以更改的,现在它的动态类型是C* 3、静态绑定绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型...因为函数DoSomething是一个no-virtual函数,它是静态绑定的,也就是编译器会在编译期根据对象的静态类型来选择函数。...因为vfun是一个虚函数,它动态绑定的,也就是说它绑定的是对象的动态类型,pB和pD虽然静态类型不同,但是他们同时指向一个对象,他们的动态类型是相同的,都是D*,所以,他们的调用的是同一个函数:D::vfun...至于那些事动态绑定,那些事静态绑定,有篇文章总结的非常好: 我总结了一句话:只有虚函数才使用的是动态绑定,其他的全部是静态绑定。目前我还没有发现不适用这句话的,如果有错误,希望你可以指出来。

2.3K30

java — 静态绑定和动态绑定

绑定:一个方法的调用与方法所在的类关联起来。java中的绑定分为静态绑定和动态绑定,又被称作前期绑定和后期绑定。...静态绑定:(final、static、private)在程序执行前已经被绑定,也就是说在编译过程中就已经知道这个方法是哪个类的方法,此时由编译器获取其他连接程序实现。...动态绑定:在运行根据具体对象的类型进行绑定。...1.静态绑定 private:不能被继承,则不能通过子类对象调用,而只能通过类本身的对象进行调用,所以可以说private方法和方法所属的类绑定;   final:final方法虽然可以被继承,但是不能被重写...唯一的不同就是,当子类对象上转型为父类对象时,不论子类中有没有定义这个静态方法,该对象都会使用父类中的静态方法。因此这里说静态方法可以被隐藏而不能被覆盖。这与子类隐藏父类中的成员变量是一样的。

3.4K90

PHP类与对象后期静态绑定操作实例详解

本文实例讲述了PHP类与对象后期静态绑定操作。分享给大家供大家参考,具体如下: 做项目是后期静态绑定非常有用。比如service层单例模式,使用后期静态绑定就非常好实现。...自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。...该功能从语言内部角度考虑被命名为“后期静态绑定”。“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。...也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。 <?...Fatal error: Call to private method C::foo() from context ‘A’ in /tmp/test.php on line 7 Note: 后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止

40451

理解静态绑定与动态绑定

绑定就是一个方法的调用与调用这个方法的类连接在一起的过程被称为绑定 绑定分类 绑定主要分为两种: 静态绑定 和 动态绑定 绑定的其他叫法 静态绑定 == 前期绑定 == 编译时绑定 动态绑定 ==...后期绑定 == 运行时绑定 为了方便区分: 下面统一称呼为静态绑定和动态绑定 静态绑定 在程序运行前,也就是编译时期JVM就能够确定方法由谁调用,这种机制称为静态绑定 识别静态绑定的三个关键字以及各自的理解...,在运行前必须要进行程序的编译过程,那么在编译期进行的绑定是前期绑定,在程序运行了,发生的绑定就是后期绑定 代码理解 public class Father {...那么上面的绑定方式是什么呢?...动态绑定静态绑定的特点 静态绑定 静态绑定在编译时期触发,那么它的主要特点是 1、编译期触发,能够提早知道代码错误 2、提高程序运行效率 动态绑定 1、使用动态绑定的前提条件能够提高代码的可用性,使代码更加灵活

1.7K80

Java中的静态绑定和动态绑定

这里首先我们将确定这种调用何种方法实现或者变量的操作叫做绑定。 在Java中存在两种绑定方式,一种为静态绑定,又称作早期绑定。另一种就是动态绑定,亦称为后期绑定。...区别对比 静态绑定发生在编译时期,动态绑定发生在运行时 使用private或static或final修饰的变量或者方法,使用静态绑定。...而这里的绑定就是在编译时期根据参数类型进行的静态绑定。 验证 光看表象无法证明是进行了静态绑定,使用javap发编译一下即可验证。...其实理论上,某些方法的绑定也可以由静态绑定实现。...所以,有些实际可以静态绑定的,考虑到安全和一致性,就索性都进行了动态绑定。 得到的优化启示? 由于动态绑定需要在运行时确定执行哪个版本的方法实现或者变量,比起静态绑定起来要耗时。

1.7K10

Java中的静态绑定和动态绑定

这里首先我们将确定这种调用何种方法实现或 者变量的操作叫做绑定。 在Java中存在两种绑定方式,一种为静态绑定,又称作早期绑定。另一种就是动态绑定,亦称为后期绑定。...区别对比 静态绑定发生在编译时期,动态绑定发生在运行时 使用private或static或final修饰的变量或者方法,使用静态绑定。...而这里的绑定就是在编译时期根据参数类型进行的静态绑定。 验证 光看表象无法证明是进行了静态绑定,使用javap发编译一下即可验证。...其实理论上,某些方法的绑定也可以由静态绑定实现。...所以,有些实际可以静态绑定的,考虑到安全和一致性,就索性都进行了动态绑定。 得到的优化启示? 由于动态绑定需要在运行时确定执行哪个版本的方法实现或者变量,比起静态绑定起来要耗时。

2K10

Java中的静态绑定和动态绑定

这里首先我们将确定这种调用何种方法实现或 者变量的操作叫做绑定。 在Java中存在两种绑定方式,一种为静态绑定,又称作早期绑定。另一种就是动态绑定,亦称为后期绑定。...区别对比 静态绑定发生在编译时期,动态绑定发生在运行时 使用private或static或final修饰的变量或者方法,使用静态绑定。...而这里的绑定就是在编译时期根据参数类型进行的静态绑定。 验证 光看表象无法证明是进行了静态绑定,使用javap发编译一下即可验证。...其实理论上,某些方法的绑定也可以由静态绑定实现。...所以,有些实际可以静态绑定的,考虑到安全和一致性,就索性都进行了动态绑定。 得到的优化启示? 由于动态绑定需要在运行时确定执行哪个版本的方法实现或者变量,比起静态绑定起来要耗时。

1.5K30
领券