PHP Class self 与 static 异同与使用详解

admin3年前PHP教程91

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

这也是我之前的认知。

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

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// self 用法 1 :调用静态成员属性
 
 
class Person
 
{
 
    protected static $maxAddressCount = 5; // 收获地址创建最大数量。
 
 
 
    public function test()
 
    {
 
        echo self::$maxAddressCount;
 
    }
 
}
 
 
 
$person = new Person();
 
$person->test();


2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 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();


2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// 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()这种用法呢,在官方文档有说明。地址:php/manual/zh/language.oop5.late-static-bindings.php

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

官方示例 1:

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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:

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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 Class self 与 static 异同与使用详解的文章就介绍到这了,更多相关PHP Class self 与 static 内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

TikTok东南亚服务器节点租用推荐

TikTok东南亚服务器节点租用推荐?TikTok是一款非常受欢迎的社交媒体应用程序,如果您想在东南亚地区使用TikTok,建议选择租用以下几个服务器节点:新加坡:新加坡是东南亚地区的中心城市之一,拥...

成都gpu服务器的选择要看业务需求

GPU即图形处理器,又称显示核心、视觉处理器、显示芯片,是一种专门用做图像和图形相关运算工作的微处理器。GPU服务器是基于GPU的应用于视频编解码、深度学习、科学计算等多种场景的快速、稳定、弹性的计算...

江西gpu服务器租用费用跟哪些因素有关

GPU服务器租用费用是一个复杂的问题,因为它涉及到多个因素。下面是一些影响GPU服务器租用费用的因素:GPU型号不同的GPU型号具有不同的性能和价格。更高性能的GPU通常价格更高。例如,NVIDIAT...

新加坡多ip服务器有哪些方面的应用

新加坡多IP服务器可以应用于以下方面:网站托管:如果您需要托管一个网站,并且希望确保网站的可用性和安全性,您可以选择新加坡多IP服务器。多IP服务器可以提供多个IP地址,从而可以确保您的网站始终可用,...

PHP json_encode中文乱码解决方法

相信很多人在使用Ajax与后台php页面进行交互的时候都碰到过中文乱码的问题。JSON作为一种轻量级的数据交换格式,备受亲睐,但是用PHP作为后台交互,容易出现中文乱码的问题。JSON和js一样,对于...

租用高防服务器的时候如何防御CC攻击?租用福建BGP高防物理机性能如何?

网络攻击只要是搭建网站并且有一定规模的网站相信一定都会遇到,尤其是在租用服务器的用户中,选择大带宽服务器的用户相对较少所以CC攻击对于网站的正常运行的破坏性是相当大的,下面就来介绍一下租用高防服务器的...