在PHP中如何使用后期静态绑定

本篇文章给大家介绍一下在php中使用后期静态绑定的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

在PHP中如何使用后期静态绑定

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

首先,我们通过一段代码来引入后期静态绑定这一概念:

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()方法。

立即学习“PHP免费学习笔记(深入)”;

而后期静态绑定呢?其实就有点像实例化的类对象,每个实例化的对象,调用的都是自身,而不是父类的属性方法。普通的静态调用可不是这样,但是现实中我们又有这样的需求,就像实例化对象的调用方式一样来调用静态属性方法,这时,我们就可以使用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,fI::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

登录后复制

推荐学习:php视频教程

以上就是在PHP中如何使用后期静态绑定的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2512733.html

(0)
上一篇 2025年3月5日 14:57:15
下一篇 2025年2月24日 14:58:54

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • php怎么将变量转换成float

    方法:1、在变量或值前添加“(float)”,例“(float)123”;2、用floatval()函数,语法“floatval(变量)”;3、用“+”运算符,语法“变量+0.0”;4、用round()函数,语法“round(变量,2)”。…

    2025年3月5日
    200
  • php中如何删除一个变量

    在php中,可以使用unset()函数来删除一个变量,该函数用于销毁给定的单个或多个变量,语法格式“unset(要销毁的变量)”。unset()在函数中的行为会依赖于想要销毁的变量的类型而有所不同。 本教程操作环境:windows7系统、P…

    2025年3月5日
    200
  • php htm怎么转为txt

    php htm转为txt的方法:首先创建一个PHP示例文件;然后通过“preg_replace ($search, $replace, $document);”方式将HTML转换成文本即可。 本文操作环境:windows7系统、PHP7.1…

    2025年3月5日
    200
  • php怎么根据农历生日进行转换

    php根据农历生日转换阳历的方法:首先保存一个PHP日期时间操作类;然后通过“function convertLunarToSolar($year,$month,$date){…}”方法将农历转为阳历即可。 本文操作环境:win…

    2025年3月5日
    200
  • php排队怎么实现

    php实现排队的方法:首先对Session存取方式进行自定义;然后将SessionID以文件名的方式存入了一个文件夹中;最后进行数据库相关操作并删除Session文件即可。 本文操作环境:windows7系统、PHP7.1版,DELL G3…

    2025年3月5日
    200
  • php怎么删除文本文件内容

    php删除文本文件内容的方法:首先创建一个PHP示例文件;然后定义操作文件以及确定要删除的行关键字;接着读取文件数据到数组中;最后删除文件指定内容即可。 本文操作环境:windows7系统、PHP7.1版,DELL G3电脑 php怎么删除…

    2025年3月5日
    200
  • php跳转页面出现forbidden怎么办

    php跳转页面出现forbidden的解决办法:首先打开apache的配置文件httpd.conf;然后修改内容为“allow from all”即可。 本文操作环境:windows7系统、PHP7.1版,DELL G3电脑 php跳转页面…

    2025年3月5日
    200
  • php 不支持unicode吗

    php是不支持unicode的,因为Unicode是一种表示所有字母和符号的可靠方式,而PHP只能支持八位二进制编码的字符集。 本文操作环境:windows7系统、PHP7.1版,DELL G3电脑 php 不支持unicode吗? Uni…

    2025年3月5日
    200
  • php strftime 乱码怎么办

    php strftime乱码的解决办法:1、使用GBK编码来解释输出;2、在调用strftime前,把系统时间设置成想要的编码格式。 本文操作环境:windows7系统、PHP7.1版,DELL G3电脑 php strftime 乱码怎么…

    2025年3月5日
    200
  • php exec 没有返回值怎么办

    php exec没有返回值的解决办法:首先查找exec调用代码;然后修改语句为“exec(‘convert a.jpg b.jpg 2>&1’, $output, $return_val);”即可。 本…

    2025年3月5日
    200

发表回复

登录后才能评论