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

PHP 7.0之前版本中的延迟静态绑定& isset

延迟静态绑定(Late Static Binding)是指在PHP 7.0之前的版本中,当使用静态方法或属性时,如果在子类中调用父类的静态方法或属性,那么父类中的静态方法或属性会被继承,而不是被覆盖。

在PHP中,静态方法和属性是属于类的,而不是属于对象的。在继承关系中,子类可以继承父类的静态方法和属性。然而,在PHP 5.3之前的版本中,当子类中调用父类的静态方法或属性时,如果父类中存在同名的静态方法或属性,子类调用的是父类的静态方法或属性,而不是子类自己的。

延迟静态绑定的优势在于可以在子类中调用父类的静态方法或属性,而不会被覆盖。这样可以方便地在子类中扩展父类的功能,同时保留父类的原有功能。

延迟静态绑定的应用场景包括但不限于以下几个方面:

  1. 在框架开发中,可以使用延迟静态绑定来实现插件机制,让插件可以扩展框架的静态方法或属性。
  2. 在面向对象的设计模式中,延迟静态绑定可以用于实现单例模式,保证只有一个实例被创建。
  3. 在多态的场景中,延迟静态绑定可以用于实现多态的静态方法,让不同的子类可以根据自己的需求来实现相同的静态方法。

腾讯云相关产品中与延迟静态绑定相关的产品和服务有限,因此无法提供具体的产品和产品介绍链接地址。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

理解PHP的延迟静态绑定

static::中的static其实是运行时所在类的别名,并不是定义类时所在的那个类名。这个东西可以实现在父类中,能够调用子类的方法和属性。...非转发调用 那么非转发调用其实就是明确指定类名的静态调用(foo::bar())和非静态调用($foo->bar()) 后期静态绑定原理 后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding...who() { echo __CLASS__; } public static function test() { static::who(); // 后期静态绑定从这里开始...方法,然后会执行static::who(),而static::中的static表示运行时所在类的别名,此时运行的类名是B,所以static::who()就是执行B中的who方法,所以输出B。...\n"; } } C::test(); 输出: A C C 分析:运行C::test()会调用C继承自B的test方法,这个方法中首先执行的是A中的foo方法,此时属于静态方法调用,static

1.3K20

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

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

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

    PHP静态延迟绑定和普通静态效率的对比 只是一个简单的小实验,对比了下 延迟绑定 和 非延迟的效率 延迟绑定主要就是使用 static 关键字来替代原来的 self ,但功能非常强大了 实验代码: class...把时间用在更多的地方,少做重复劳动的事情】/'d'); protected static $cc5 = array('a5', 'b', 'c', 'd'); public static function...,其中 A 类是使用了静态延迟, B 类是非延迟, C 类是继承A类实现了静态成员变量和方法的延迟绑定。...过程也不多说了,环境是 PHP5.4.27 直接上测试结果: 有两种情况, 当只有 A、B类(也就是不让任何类继承A类)时,效率上几乎没有差别的 当A类被C类继承了之后,使用静态延迟绑定的A类性能将会比...类后,重载了部分 A 类中的静态成员变量,重载的越多则速度和 B 类(非延迟)就越接近,但 A 类的速度仍然会比 B 类 和 C 类慢

    63730

    后期静态绑定在PHP中的使用

    后期静态绑定在PHP中的使用 什么叫后期静态绑定呢?其实我们在之前的文章PHP中的static中已经说过这个东西了。今天我们还是再次深入的理解一下这个概念。...别激动,这是普通的静态绑定。self关键字调用的内容取决于它定义时所在的类。也就是说不管怎么继承,用哪个子类来调用test()方法,self关键字都会调用的是A类的who()方法。 而后期静态绑定呢?...普通的静态调用可不是这样,但是现实中我们又有这样的需求,就像实例化对象的调用方式一样来调用静态属性方法,这时,我们就可以使用static关键字来实现后期静态绑定。...官方文档中的定义如下: 当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。 该功能从语言内部角度考虑被命名为“后期静态绑定”。...“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。

    71210

    PHP7新特性和变化

    PHP7新特性和变化 php7出了不少语法糖和新操作,让我们来看看代码中常用的一些骚东西,拥抱变化! PHP7.0新特性 组合比较符 组合比较符号用于比较两个表达式。... ['a', 'b']); // int(0) null合并运算符 由于日常使用中存在大量同时使用三元表达式和isset操作。...::call 闭包绑定 简短干练的暂时绑定一个方法到对象上闭包并调用它。...class A {private $x = 1;} // PHP 7 之前版本的代码 $getXCB = function() {return $this->x;}; $getX = $getXCB-...因为在 PHP 7 版本中,已经使用抛出异常的错误处理机制了。 (如果代码中没有捕获Error异常,那么会引发致命错误)。set_error_handle不一定接收的是异常,有可能是错误。

    4K41

    Laravel5.2之PHP重载(overloading)

    说明:本文主要讲述PHP中重载概念,由于Laravel框架中经常使用这块知识点,并且PHP的重载概念又与其他OOP语言如JAVA中重载概念不一样,故复习并记录相关知识点。...overloading) 在Laravel中就大量应用了重载相关知识,如在IlluminateSupportFacadesFacade中就用到了方法重载知识:使用魔术方法__callStatic()来动态创建类中未定义或不可见的静态方法...PHP中重载概念与其他的OOP语言如JAVA语言中重载概念还不一样,PHP中重载概念主要是:动态的创建类属性和方法,而不是一般的类中方法名一样而参数不一样。...PHP中是可以动态创建一个类中未定义属性或方法的,这也是PHP这个语言的一个比较灵活的特性,如: class Person { } $person = new Person(); $person->...resolveFacadeInstance(static::getFacadeAccessor());//这里调用Config::getFacadeAccessor(),返回'config',static是静态延迟绑定

    3.1K31

    PHP7 新特性简介(一)

    另外其PHP7的兼容性也是非常好的。因此,其他版本向PHP7迁移过程中,程序调整不会太大。本文不针对性能提升原因做深入研究,主要是简单描述一下PHP7一些新增的特性。...php //获取用户openid.先从$_GET中获取,如果没有从$_POST中获取,如果还是不存在,就默认空 //PHP7之前的写法 $sOpenid = isset($_GET...任何一个匿名函数PHP都会自动产生一个Closure类的对象。如果需要复制一个闭包对象且调用它,在PHP7之前版本,写法较为繁琐,而在PHP7可以通过call方法来快速实现。 php class A { private $x = 1; } // PHP 7 之前版本的代码 $getXCB = function()...{ return $this->x; }; //复制闭包对象$getXCB,并将该闭包绑定到类A的实例化对象上,“绑定对象”决定了函数中$this的取值

    1.9K00

    php中self与static的区别

    static关键字和延迟静态绑定(late static binding) 在PHP5.3中,加入了一个新的特性,叫做延迟静态绑定。它可以帮我们实现多态,解决上面的问题。...简单来说,延迟静态绑定意味着,当我们用static关键字调用一个继承方法时,它将在运行时绑定调用类(calling class)。...在上面的例子中,如果我们使用延迟静态绑定(static),意味当我们调用“Mercedes::model();”时,class Mercedes中的getModel方法将会被调用。...php 5.3以下的版本无法使用延迟静态绑定 注意,php 5.3之前的版本无法使用延迟静态绑定。如果尝试在php 5.3以下的版本运行上面的例子,将会报错。...php中的self和static 现在我们将例子中的self用static替换,可以看到,两者的区别在于:self引用的是当前类(current class)而static允许函数调用在运行时绑定调用类

    57520

    hyperf框架使用rabbitMQ生产消息至laravellumen进行消费

    背景 需要做项目迁移时,例如laravel迁移至hyperf时,因为基本上都是一步一步迁移的,仍有例如支付回调等依旧在laravel框架中进行消费的情况。...需要接管处理消息的queue进行数据格式改造,利用构造同样命名空间的job去进行投递,他会序列化数据,可以debug一下内容哦,然后投递至rabbitMQ后,laravel进行消费就好啦。...其中hyperf的版本背景为2.1 话不多说开干 在app下建立Job目录为例,大家可以根据情况来 在Job目录下建立Job.php,复制以下代码 <?...routingKey, "x-message-ttl" => $ttl * 1000, ))); //绑定延迟队列到交换器上...Copy 使用方式 注意需要和laravel/lumen 保持同样的命名空间哦 创建的job需要继承 ```AppJobJob`` <?

    95310

    Laravel源码解析之Database

    在我们学习和使用一个开发框架时,无论使用什么框架,如何连接数据库、对数据库进行增删改查都是学习的重点,在Laravel中我们可以通过两种方式与数据库进行交互: DB, DB是与PHP底层的 PDO直接进行交互的...在讲服务容器绑定时就说过了依赖注入的其中一个作用是延迟初始化对象,所以只要在用到数据库连接实例时它们才会被创建。...db DatabaseManger 作为Database面向外部的接口, DB这个Facade就是DatabaseManager的静态代理。...->app = $app; $this->factory = $factory; } ConnectionFactory是在上面介绍的绑定 db服务的时候传递给DatabaseManager的。...总结 说的东西有点多,我们来总结下文章里讲到的Database的这几个组件的角色 名称 作用 DB DatabaseManager的静态代理 DatabaseManager Database面向外部的接口

    1.3K30

    PHP7.0~PHP7.1~PHP7.2~PHP7.3~PHP7.4新特性

    PHP7.0新特性 PHP7.1新特性 PHP7.2新特性 PHP7.3新特性 PHP7.4新特性 PHP7.0新特性 1.标量类型的声明 标量类型声明有两种模式: 强制 (默认) 和 严格模式。...php class A {private $x = 1;} // PHP 7 之前版本的代码 $getXCB = function() {return $this->x;}; $getX = $getXCB...> 复制代码 13.生成器可以返回表达式 此特性基于 PHP 5.5 版本中引入的生成器特性构建的。..., 因为它使得调用生成器的客户端代码可以直接得到生成器(或者其他协同计算)的返回值, 相对于之前版本中客户端代码必须先检查生成器是否产生了最终的值然后再进行响应处理 来得方便多了。...可以使用 list() 函数来展开实现了 ArrayAccess 接口的对象 ¶ 在之前版本中,list() 函数不能保证 正确的展开实现了 ArrayAccess 接口的对象, 现在这个问题已经被修复

    15.3K21

    PHP面向对象精华

    范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员、方法和常量,还可以用于子类覆盖父类中的成员和方法。...也就是说,当在扩展类中使用self时,它调用的不是父类的方法,而是扩展类的重载的方法。self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。...,所以非常适合在使用对象之前做一些初始化工作。...在PHP5 中,预定义了两个函数“__get()”和“__set()”来获  取和赋值其属性,以及检查属性的“__isset()”和删除属性的方法“__unset()”。...另外, php5中对于大数组的传递,建议用 "&" 方式, 毕竟节省内存空间使用。 取消引用 当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。

    3.4K30
    领券