加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

PHP中self与static怎么样用 有什么不同

发布时间:2023-07-11 13:35:48 所属栏目:语言 来源:
导读:这篇文章主要介绍“PHP中self与static怎么样用,有何不同”的相关知识,下面会通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP中self与static怎么样用,有何不同”

这篇文章主要介绍“PHP中self与static怎么样用,有何不同”的相关知识,下面会通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP中self与static怎么样用,有何不同”文章能帮助大家解决问题。

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

对于大多数 PHPer 来说,self 与 static 两个 PHP 关键词都不算陌生。对于大多数 PHPer 来说,self 与 static 两个 PHP 关键词都不算陌生。但是PHP Class self与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 父类里面定义的方法与子类有同名冲突的情况。但是,当子类调用的时候,那么自动切换到子类的静态同名方法。取决于调用者。

大家可以通过运行以上两个示例进行理解。

之所以会有本篇小节内容。是因为我在实际运行当中要继承单例方法导致了这个问题。所以,才牵扯出这个特性。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!