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

 更新时间:2021年09月17日 09:36:47   作者:藏色散人  
这篇文章主要介绍了PHP中 Class 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 Class self 与 static 异同与使用详解的文章就介绍到这了,更多相关PHP Class self 与 static 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • php实现把数组按指定的个数分隔

    php实现把数组按指定的个数分隔

    这篇文章主要介绍了php实现把数组按指定的个数分隔。需要的朋友可以过来参考下,希望对大家有所帮助
    2014-02-02
  • php at(@)符号的用法简介

    php at(@)符号的用法简介

    对于php的初学者,经常会看到在一个函数名字前面有一个at(@)符号,但是不知道它的作用和用法,去掉后好像对程序没有什么影响,感到很困惑,简单的说@可以忽略错误,有仰制错误的功能为错误控制操作符.
    2009-07-07
  • PHP经典的给图片加水印程序

    PHP经典的给图片加水印程序

    PHP经典的给图片加水印程序...
    2006-12-12
  • PHP中preg_match函数正则匹配的字符串长度问题

    PHP中preg_match函数正则匹配的字符串长度问题

    这篇文章主要介绍了PHP中preg_match函数正则匹配的字符串长度问题,如果你也遇到了preg_match正则提取内容时总是空白或提取不到的话,那就可能是遇到了这个问题啦,需要的朋友可以参考下
    2015-05-05
  • php SQL防注入代码集合

    php SQL防注入代码集合

    php下实现sql防注入效果代码,asp的比较多,php的倒不多见,喜欢php的朋友可以参考下
    2008-04-04
  • 学习php设计模式 php实现备忘录模式(Memento)

    学习php设计模式 php实现备忘录模式(Memento)

    这篇文章主要介绍了php设计模式中的备忘录模式,使用php实现备忘录模式,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • 9个比较实用的php代码片段

    9个比较实用的php代码片段

    这篇文章主要介绍了9个非常有用的PHP代码片段,可以帮助你开发 PHP项目,下面这里收集了9个PHP代码片段,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • PHP获取文件后缀名的三个函数

    PHP获取文件后缀名的三个函数

    PHP取得文件后缀,关于获取文件的扩展名有很多种方式,下面提供三种获取文件后缀的方法,大家可以研究下,具体代码就不解释了。直接看代码吧
    2012-10-10
  • 给初学者的30条PHP最佳实践(荒野无灯)

    给初学者的30条PHP最佳实践(荒野无灯)

    给初学者的30条PHP最佳实践,需要的朋友可以参考下。
    2011-08-08
  • php计算年龄精准到年月日

    php计算年龄精准到年月日

    这篇文章主要介绍了php计算年龄精准到年月日的方法,涉及php操作日期与字符串的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-11-11

最新评论