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

 更新时间:2021-11-14 18:46:30   作者:佚名   我要评论(0)

对于大多数 PHPer 来说,self 与 static 两个 PHP 关键词都不算陌生。我们学会通过self::xxxx这种方式来调用当前类的静态属性和方法。而 sta

对于大多数 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的new static和new self的区别与使用
  • PHP面向对象程序设计中的self、static、parent关键字用法分析
  • php面向对象程序设计中self与static的区别分析
  • PHP面向对象中new self()与 new static()的区别浅析
  • 浅谈PHP中new self()和new static()的区别

相关文章

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

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

    对于大多数 PHPer 来说,self 与 static 两个 PHP 关键词都不算陌生。我们学会通过self::xxxx这种方式来调用当前类的静态属性和方法。而 sta
    2021-11-14
  • 聊聊PHP中删除字符串的逗号和尾部斜杠的方法

    聊聊PHP中删除字符串的逗号和尾部斜杠的方法

    正如标题所述,本文将给大家通过两个示例来介绍PHP删除字符串中的逗号以及尾部斜杠的方法,感兴趣的朋友咱们一起继续往下看吧~ 下面我们通过
    2021-11-14
  • php访问对象中的成员的实例方法

    php访问对象中的成员的实例方法

    对象是由成员属性和成员方法构成的,想要访问对象成员的话,实际上有点像访问数组中的元素,既然有点像的话,通过对象的引用来访问对象的成员
    2021-11-14
  • php如何处理setcookie失效的问题

    php如何处理setcookie失效的问题

    1、浏览器开启cookie。 2、删除在setcookie()之前的任何HTTP头部输出。 3、使用php的setcookie()来创建cookie即可。 使用php的setcookie()来
    2021-11-14
  • php实例化对象的实例方法

    php实例化对象的实例方法

    想要将类实例化成对象,只是多了一个简单的小步骤,需要使用new关键字并且在后面加上一个和类名同名的方法就可以了。表明一个新的对象。 需要
    2021-11-14
  • 聊聊PHP中die()和sleep()函数的用法

    聊聊PHP中die()和sleep()函数的用法

    在上一篇《聊聊PHP中删除字符串的逗号和尾部斜杠的方法》给大家介绍了PHP删除字符串中的逗号以及尾部斜杠的方法,感兴趣的朋友可以去学习了解
    2021-11-14
  • php png失真的原因及解决办法

    php png失真的原因及解决办法

    1、创建一个PHP示例文件。 2、创建一个和背景图片一样大小的真彩色画布。 3、复制背景图片。 4、通过“imagecreatefrompng”合成png图片即可
    2021-11-14
  • Laravel框架实现点播上传阿里云功能

    Laravel框架实现点播上传阿里云功能

    1、确认框架中安装了第三方alibabacoud控件 实现代码如下 上传过程中遇到任务问题,可以进行留言 <&#63;php namespace App\Api\xxxx\Con
    2021-11-14
  • 聊聊PHP中的 === 运算符为什么比 == 快

    聊聊PHP中的 === 运算符为什么比 == 快

    在上一篇《聊聊PHP中require_once()函数为什么不好用》中给大家介绍了PHP中require_once()为什么不好用的原因,感兴趣的朋友可以去阅读了解一
    2021-11-14
  • php双向队列实例讲解

    php双向队列实例讲解

    1、双向队列是指一种具有队列和栈的性质的数据结构。 2、双向队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。 双向队列就
    2021-11-14

最新评论