PHP中self与static关键词有何异同,常见用法是什么
Admin 2022-08-27 群英技术资讯 532 次浏览
对于大多数 PHPer 来说,self 与 static 两个 PHP 关键词都不算陌生。我们学会通过self::xxxx
这种方式来调用当前类的静态属性和方法。而 static 呢?想必很多人只知道它是用于定义一个静态方法和类属性关键词。
这也是我之前的认知。
现在我们来回顾一下这两个关键词的一些常见用法:
// self 用法 1 :调用静态成员属性 <?php class Person { protected static $maxAddressCount = 5; // 收获地址创建最大数量。 public function test() { echo self::$maxAddressCount; } } $person = new Person(); $person->test();
// self 用法 2 :调用静态方法 <?php 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 :创建一个当前对象 <?php // 单例示例 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:
<?php 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:
<?php 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 父类里面定义的方法与子类有同名冲突的情况。但是,当子类调用的时候,那么自动切换到子类的静态同名方法。取决于调用者。
大家可以通过运行以上两个示例进行理解。
之所以会有本篇小节内容。是因为我在实际运行当中要继承单例方法导致了这个问题。所以,才牵扯出这个特性。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章给大家分享的是yii2框架场景的使用,主要介绍了规则场景的使用示例以及场景方法定义字段的在固定场景下才能被修改的的示例,具有一定的参考价值,感兴趣的朋友们可以看看。
在本篇文章里小编给大家整理的是一篇关于php修改word的实例方法,有兴趣的朋友们可以跟着学习参考下。
这篇文章主要介绍了PHP获取访问设备信息的方法,结合实例形式分析了php针对访问设备的浏览器类型、浏览器语言、操作系统类型、访客IP、访客地址等相关函数封装与使用技巧,需要的朋友可以参考下
PHP中self与static怎么样用,有何不同?在实际项目的操作过程或是学习过程中,不少人都会遇到这样的问题,接下来就让小编带大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
在 PHP 中使用 MySQLi 函数需要注意的是:你需要添加对 MySQLi 扩展的支持。一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解一下,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008