php类与对象(三)后期静态绑定

Laravel 中的后期静态绑定 后期静态绑定是 Laravel 中一个强大且实用的特性,它允许在继承关系中动态地调用静态方法或访问静态属性,并确保调用的方法或属性与当前调用的类保持一致。后期静态绑定(Late Static Binding)是 Laravel 框架中一个重要的特性,它允许你在继承关系中动态地调用静态方法或访问静态属性,并且确保调用的方法或属性与当前调用的类保持一致。关键字,动态地调用静态方法或访问静态属性,并且确保调用的方法或属性与当前调用的类保持一致。方法,都会根据当前调用的类动态地调用相应的方法。 阅读详情

后期静态绑定

自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。

准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的“转发调用”(forwarding call)指的是通过以下几种方式进行的静态调用:self::,parent::,static:: 以及 forward_static_call()。可用 get_called_class() 函数来得到被调用的方法所在的类名,static:: 则指出了其范围。

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

 

1、self:: 的限制

使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类:

class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        self::who();
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();//A

 

2、后期静态绑定的用法

后期静态绑定本想通过引入一个新的关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用 test() 时引用的类是 B 而不是 A。最终决定不引入新的关键字,而是使用已经预留的 static 关键字。

class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // 后期静态绑定从这里开始
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();//B

 

3、在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 static:: 只能用于静态属性。

class A {
    private function foo() {
        echo "success!\n";
    }
    public function test() {
        $this->foo();
        static::foo();
    }
}

class B extends A {
   /* foo() will be copied to B, hence its scope will still be A and
    * the call be successful */
}

class C extends A {
    private function foo() {
        /* original method is replaced; the scope of the new one is C */
    }
}

$b = new B();
$b->test();
$c = new C();
$c->test();   //fails

以上例程会输出:

success!
success!
success!


Fatal error:  Call to private method C::foo() from context 'A' 

 

后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息

class A {
    public static function foo() {
        static::who();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    public static function who() {
        echo __CLASS__."\n";
    }
}

C::test();//A C C

 




class a{

static protected $test="class a";

public function static_test(){

echo static::$test; // Results class b
echo self::$test; // Results class a

}

}

class b extends a{

static protected $test="class b";

}

$obj = new b();
$obj->static_test();

 

PHP:后期静态绑定 阅读详情

相关推荐

Claude + Figma MCP 实战教程

• 拥有 Figma 的 Dev 或 Full seat(专业/企业账号)权限 才能启用 Dev-Mode MCP 服务 。• MCP 是通过标准接口连接 Claude 与 Figma,效率高,但目前仍为 Beta,稳定性可能有限。3. 服务启动后,会在本地运行,比如 http://127.0.0.1:3845/mcp 。如果设置正确,会显示已连接的 figma-dev-mode-mcp-server  。• 如果多次转换复杂组件,可能需要多次选择与多次生成,建议合理拆分设计任务。

weixin_49869937的博客 4451

解释一下PHP中的后期静态绑定(Late Static Binding)。

这就像是我们有一个动物王国的大家庭,里面有很多不同的动物。每个动物都有自己的说话方式,但是它们都有一个共同的祖先——动物。当我们让某个动物说话时,它会按照自己的方式来说话,而不是按照它祖先的方式来说话。在PHP中,静态方法是属于类本身的方法,而不是属于类的某个具体对象的方法。简单来说,它允许我们在子类中调用父类的静态方法时,能够保持对子类本身的引用,而不是被绑定到父类上。后期静态绑定(Late Static Binding)是PHP中的一个功能,它可以帮助我们在继承关系中更好地处理静态方法的调用。

长风破浪会有时的博客 313

Carla自动驾驶仿真一:快速安装与运行Carla

网上有不少的Windows版本的Carla的安装教程,这里简单记录下自己安装过程,写的也比较详细,基本不用看其他文章。

zataji的博客 2万+

PHP之后期静态绑定

PHP后期静态绑定的(late static bindings) 理解PHP延迟静态绑定 static::中的static其实是运行时所在类的别名,并不是定义类时所在的那个类名。这个东西可以实现在父类中能够调用子类的方法和属性。 使用(static)关键字来表示这个别名,和静态方法,静态类没有半毛钱的关系,static::不仅支持静态类,还支持对象(动态类)。 转发调用: 所谓的“转发调...

allanshi1986008的博客 157

RK3568平台开发系列讲解(音频篇)配置声卡

📢本篇文章介绍如何配置声卡。

内核笔记 2448

YOLOv12涨点改进 | 全网独家首发Conv改进篇 | Arxiv 2025 | 引入一种新的WConv加权卷积改进YOLOv12,显著提升其特征提取能力和目标检测精度

本文提出了一种新型加权卷积(WConv)模块,通过引入最优密度函数动态调整邻域像素权重,显著提升了YOLOv12目标检测性能。WConv在保持参数数量不变的情况下,提高了模型精度(VGG准确率提升10%)、增强了小目标检测能力,并改善了多尺度特征提取。文中详细介绍了模块原理、网络结构改进方法,并提供了核心代码实现和yaml配置文件。实验表明,该方法在图像任务中最高可降低53%的损失,虽然会带来11%的时间开销,但具有优异的鲁棒性。该技术可广泛应用于2D/3D图像处理领域。

Ai缝合怪、助力小伙伴高效发论文 216

php 后期静态绑定

https://www.php.net/manual/zh/language.oop5.late-static-bindings.php 自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。 准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的“转发调用”(forwar.

wade1010的专栏 290

Intellij IDEA 使用教程(一)Jdk安装和配置

一.JDK下载 这里下载的是Java SE 8u181 64位版本。可以根据自己电脑配置来选择不同版本。 官网下载JDK 二.安装JDK 双击运行jdk-8u181-windows-x64.exe安装程序 选择安装目录,然后点击下一步 等待安装 安装JRE,就是java的运行环境,可以安装在java目录下 等待安装 安装完成。点击关闭。 三.java环境变量配置 关于环境变量的配置,...

岁月不饶人,我亦未曾饶过岁月 4055

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

所以,这就很好的解释了为什么上面的代码输出了A。所谓延迟静态绑定,顾名思义,静态调用时::符号左侧的部分的的绑定是延迟,也就是说不再被解析为定义当前方法所在的类,而是在实际运行时计算的。可以看到,在MySQLHandler和MemcachedHandler类中,都有一个create函数,除掉我的输出语句,发现它们一模一样,这就是代码冗余。如果大家有什么建议,让我的文章写的更好,尽管提出来,我需要大家的帮助。好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值。

很酷的站长的博客 483

全网首发--Unet3+改进16:在不同位置添加RepLKBlock超大卷积核

本文提出了一种基于大核卷积的神经网络架构RepLKNet,旨在缩小CNN与ViTs之间的性能差距。通过重新审视CNN中的大核设计,研究证明使用少量大卷积核替代多个小核能获得更强大的性能。提出的RepLKNet采用31×31大卷积核,在ImageNet和下游任务上取得了与SwinTransformer相当或更好的结果,同时具有更低延迟。文章详细介绍了实现步骤:(1)创建RepLKBlock模块文件;(2)在模型层中添加注意力机制;(3)在UNet模型中集成RepLKBlock;(4)完成训练流程。该方法展现了

AIcurator的博客 622

EUV光源技术路线深度解析

EUV光刻技术的关键瓶颈在于13.5纳米光源的稳定高效获取。主流技术路线从DPP放电等离子体发展为LPP激光等离子体方案,后者通过激光轰击锡液滴实现更高功率输出。新出现的LDP技术综合激光预热与放电优势,虽功率扩展性有限,但为光源技术提供了有益补充。目前LPP仍是唯一通过量产验证的方案,而LDP可能作为过渡技术应用于特定场景。EUV光源的发展实质是能量转化效率与系统可靠性的持续优化过程,各种技术路线的探索共同推动着这一核心工艺的进步。

硬核科技 556

PHP 开发中常见的后期静态绑定混淆详细解析与解决方案

本文深入解析PHP后期静态绑定(LSB)的常见混淆问题及解决方案。通过对比self、static和$this三种绑定方式的差异,指出self编译时绑定导致的继承问题,而static能实现运行时动态绑定。针对工厂模式和单例模式中的典型误用场景,提供正确实现方案:在工厂方法中使用new static()而非new self();在单例模式中通过static::class和$instances数组为每个子类维护独立实例。这些解决方案充分利用LSB特性,确保继承体系中的方法调用能正确绑定到实际调用的子类。

深山技术宅的博客 1854

详细解释xilinx源语的使用:IDELAYE2和IDELAYE3

/ 完整的数据位对齐模块input wire dqs, // 数据选通input wire [7:0] dq_in, // 8位数据输入output wire [63:0] data_out // 并行数据输出// 延迟控制信号// 每个数据位都需要独立的IDELAYgenvar i;i < 8;// IDELAYE2实例.IDELAY_VALUE (10), // 初始值。

baidu_34971492的博客 436

PHP 中 self、static、$this 的区别 & 后期静态绑定详解

self、static 和 $this 的区别为了更好地理解 self、static 和 $this 的区别,先来看一个示例。&lt;?php class A { protected $name = 'A'; static $alias = 'a'; const HASH = 'md5'; public function dd() { echo ...

彳亍 7789

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

php后期静态绑定例子讲解

自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。 self:: 的限制 使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类:   <?php class A { public static function who() { echo __CLASS__; }

MBLHQ的博客 1401

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

对 PHP 后期静态绑定的理解

什么是后期静态绑定 在看一些框架源码或者是某个项目的代码时,经常能看到后期静态绑定的用法 。比如下面这段: public static function getInstance() { if (is_null(static::$instance)) { static::$instance = new static; } return static::$...

weixin_41282397的博客 331

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

本文实例讲述了PHP类与对象后期静态绑定操作。分享给大家供大家参考,具体如下:做项目是后期静态绑定非常有用。比如service层单例模式,使用后期静态绑定就非常好实现。自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时...

weixin_39974882的博客 108

PHP如何进行类与类的关联,PHP类与对象后期静态绑定操作实例详解

本文实例讲述了PHP类与对象后期静态绑定操作。分享给大家供大家参考,具体如下:做项目是后期静态绑定非常有用。比如service层单例模式,使用后期静态绑定就非常好实现。自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时...

weixin_42303285的博客 132

PHP后期静态绑定测试

后期静态绑定(PHP手册) 自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。 准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的“转发调用”(for

云端 568

php 后期静态,php后期静态绑定

自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的“转发调用”(forwarding call)指的是通过以...

weixin_35214204的博客 155

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

后期静态绑定在PHP中的使用什么叫后期静态绑定呢?其实我们在之前的文章PHP中的static中已经说过这个东西了。今天我们还是再次深入的理解一下这个概念。首先,我们通过一段代码来引入后期...

硬核项目经理 162

php后静态绑定,详解PHP后期静态绑定分析与应用

基础知识1. 范围解析操作符 (::)可以用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法。self,parent 和 static 这三个特殊的关键字是用于在类定义的内部对其属性或方法进行访问的。parent用于调用父类中被覆盖的属性或方法(出现在哪里,就将解析为相应类的父类)。self用于调用本类中的方法或属性(出现在哪里,就将解析为相应的类;注意与$this区别,$this指向当前实...

weixin_42523260的博客 208

PHP的后期静态绑定理解

官方原文: 后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。 当进行静态方法调用时,该类名即为明确指定的那个(通常在::运算符左侧部分); 当进行非静态方法调用时,即为该对象所属的类。 所谓的“转发调用”(forwarding call)指的是通过以下几种方式进行的静态调用:self::,parent::,static::以及fo...

mzhnuaa的博客 233

php static 后期静态绑定

简单通俗的来说, self就是写在哪个类里面, 实际调用的就是这个类. 所谓的后期静态绑定, static代表使用的这个类, 你在父类里写的static, 然后通过子类直接/间接用到了这个static, 这个static指的就是这个子类, 所以说static和$this很像, 但是static可以用于静态方法和属性等. 举个简单的例子, <?php class ATest { ...

caiyiii的专栏 180

PHP后期静态绑定理解

最近遇到一个php手册上的例子,自己扫了一眼,做错了,mark一下 <?php class A { public static function foo() { static::who(); } public static function who() { echo __CLASS__."\n"; } } class B ...

老李的博客 193
上一篇: php常识
下一篇: php类与对象(四)抽象类
wiscourper_
博客等级 码龄17年 1641粉丝 272原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值