PHP中self与static关键字有何区别及具体使用方法?

2026-04-06 07:3710阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1197个文字,预计阅读时间需要5分钟。

PHP中self与static关键字有何区别及具体使用方法?

对于许多PHPer来说,self与static这两个PHP关键字都不陌生。它们都不算新生儿。

我们学会通过self::xxxx这种形式来调用当前类的静态属性和方法。而static呢?很多人只知道它是用来定义一个静态的常量。

其实,static关键字还有更深层次的用途。它可以将变量或方法声明为静态的,这意味着它们属于类本身,而不是类的实例。这样一来,无论创建多少个类的实例,静态成员都只有一个副本。

简单来说,static关键字主要用于:

1. 定义静态变量:这些变量在类的所有实例之间共享,并且只初始化一次。

2.定义静态方法:这些方法不依赖于类的实例,可以直接通过类名调用。

举个例子:

php

class MyClass { public static $staticVar='Hello, World!';

public static function staticMethod() { echo $staticVar; }}

echo MyClass::$staticVar; // 输出:Hello, World!MyClass::staticMethod(); // 输出:Hello, World!

PHP中self与static关键字有何区别及具体使用方法?

在这个例子中,$staticVar和staticMethod都是静态的,因此可以通过类名直接访问它们。

对于大多数 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()这种用法呢,在官方文档有说明。地址: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 内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

本文共计1197个文字,预计阅读时间需要5分钟。

PHP中self与static关键字有何区别及具体使用方法?

对于许多PHPer来说,self与static这两个PHP关键字都不陌生。它们都不算新生儿。

我们学会通过self::xxxx这种形式来调用当前类的静态属性和方法。而static呢?很多人只知道它是用来定义一个静态的常量。

其实,static关键字还有更深层次的用途。它可以将变量或方法声明为静态的,这意味着它们属于类本身,而不是类的实例。这样一来,无论创建多少个类的实例,静态成员都只有一个副本。

简单来说,static关键字主要用于:

1. 定义静态变量:这些变量在类的所有实例之间共享,并且只初始化一次。

2.定义静态方法:这些方法不依赖于类的实例,可以直接通过类名调用。

举个例子:

php

class MyClass { public static $staticVar='Hello, World!';

public static function staticMethod() { echo $staticVar; }}

echo MyClass::$staticVar; // 输出:Hello, World!MyClass::staticMethod(); // 输出:Hello, World!

PHP中self与static关键字有何区别及具体使用方法?

在这个例子中,$staticVar和staticMethod都是静态的,因此可以通过类名直接访问它们。

对于大多数 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()这种用法呢,在官方文档有说明。地址: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 内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!