您现在的位置是:群英 > 开发技术 > 编程语言
PHP中self与static的常见用法是什么
Admin发表于 2022-09-26 18:00:42478 次浏览
相信很多人对“PHP中self与static的常见用法是什么”都不太了解,下文有实例供大家参考,对大家了解操作过程或相关知识有一定的帮助,而且内容详细,逻辑清晰,接下来群英小编就为你详细解释一下这个问题。


对于大多数 PHPer 来说,self 与 static 两个 PHP 关键词都不算陌生。我们学会通过self::xxxx这种方式来调用当前类的静态属性和方法。而 static 呢?想必很多人只知道它是用于定义一个静态方法和类属性关键词。

这也是我之前的认知。

现在我们来回顾一下这两个关键词的一些常见用法:

// self 用法 1 :调用静态成员属性


class Person

{

    protected static $maxAddressCount = 5; // 收获地址创建最大数量。

 

    public function test()

    {

        echo self::$maxAddressCount;

    }

}

 

$person = new Person();

$person->test();
// self 用法 2 :调用静态方法


class Person

{

    protected static $maxAddressCount = 5; // 收获地址创建最大数量。

 

    protected static function getMaxAddressCount()

    {

        return self::$maxAddressCount;

    }

 

    public function test()

    {

        echo self::getMaxAddressCount();

    }

}

 

$person = new Person();

$person->test();
// self 用法 3 :创建一个当前对象


// 单例示例

class Person

{

    private static $instance = null;

 

    private function __construct() {}

 

    final public static function getInstance()

    {

        if (self::$instance == null) {

            self::$instance = new self;

        }

        return self::$instance;

    }

 

    public function test()

    {

        echo "hello world!";

    }

}

 

$person = Person::getInstance();

$person->test();

关于 static 关键词的常见用法也在上面 3 个示例中得到综合体现

我深信上面的用法,任何一个入门的 PHPer 都是非常熟悉的。现在我要讲的是以下两种方式:

new self()new static() 的区别?

我相信很多人都知道new self()创建一个当前类的对象,并不知道new static()也能创建一个当前类的对象。

关于new static()这种用法呢,在官方文档有说明。地址:https://www.php.net/manual/zh/language.oop5.late-static-bindings.php

PHP 官方把这种方式称为:后期静态绑定。

官方示例 1:

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();

因为 Class B 继承了 Class A。 A 与 B 都有一个静态方法who()。此时通过B::test()的时候,调用的实际上是 Class A 的who()方法。

因为子类 Class B 的静态方法who()属于在 Class A 之后的子类里面才定义的。而 PHP 的默认特性只允许调用最先定义的。

就这引出了后期静态绑定的概念。

官方示例 2:

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();

我们把 Class A 里面的test()方法体的self更改为static之后,static 代表的永远是指向调用类。也就是说虽然在 Class A 父类里面定义的方法与子类有同名冲突的情况。但是,当子类调用的时候,那么自动切换到子类的静态同名方法。取决于调用者。

大家可以通过运行以上两个示例进行理解。

之所以会有本篇小节内容。是因为我在实际运行当中要继承单例方法导致了这个问题。所以,才牵扯出这个特性。


到此这篇关于“PHP中self与static的常见用法是什么”的文章就介绍到这了,感谢各位的阅读,更多相关PHP中self与static的常见用法是什么内容,欢迎关注群英网络资讯频道,小编将为大家输出更多高质量的实用文章!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: self与static
相关信息推荐
2022-07-20 17:50:53 
摘要:golang切片可以不使用make创建。golang使用make创建切片可以指定切片长度。也可以通过字面量创建切片,此方法和创建数组类似。
2022-12-01 16:14:40 
摘要:php验证码失效的解决办法:1、开启gd2选项;2、使用windows自带的记事本编辑器对网站配置文件进行修改和保存;3、使用“ob_clean()”方法清除相关缓存;4、重写规则“.htaccess”;5、开启Redis服务即可。
2022-11-12 17:41:48 
摘要:Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部