PHP中self与static的用法有什么异同,怎么用的
Admin 2022-08-05 群英技术资讯 1035 次浏览
在这篇文章中,我们来学习一下“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 父类里面定义的方法与子类有同名冲突的情况。但是,当子类调用的时候,那么自动切换到子类的静态同名方法。取决于调用者。
大家可以通过运行以上两个示例进行理解。
之所以会有本篇小节内容。是因为我在实际运行当中要继承单例方法导致了这个问题。所以,才牵扯出这个特性。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在thinkphp中,distinct()方法用于去除重复的值,能够返回唯一不同的值,distinct方法的参数是一个布尔值,语法为“$Model->distinct(布尔值参数)->field('name')->select();”。
php超详细讲解命名管道 目录 进程间为什么要通信 进程如何实现通信 常见进程通信方式 管道概念 命名管道实现 posix_mkfifo函数 无血缘进程间通信 进程间为什么要通信 进程间通信的目的: 数据传输:一个 进程需要将它的数据 发送给另一个进程. 通知事件:一个进程需要向另一个或一组进程 发送消息,通知它(它们)发生了 某种事件(如进程终止时要通知父进程). 资源共享:多个进程之间 共享同样的资源 .为了做到这一点,需要内核提供互斥和同步机制. 进程控制:有些进程 希望完全控制另一个进程的执行 (如 Debug
PHP如何实现多继承?PHP本身是不支持多继承的,只支持单继承,但是我们能通过的别的方法来实现php多继承。下面就给大家分享一些实现php多继承的常见方法。
该函数可以向/tmp/my.log文件输出一条日志,包括函数执行的日期、在哪一行执行、由哪个方法执行, 在__METHOD__之后可以加上我们想打印的变量,比如$a,然后就像下面这样...
你清楚php如何实现异步执行吗?其实利用四种方式来处理就行,如果你对这方面感兴趣的话,下文有详解方法和实例,内容详细,逻辑清晰,有需要的朋友可以参考,希望大家阅读完这篇文章后能有所收获,那么下面就一起来了解一下吧。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008