PHP Class self 与 static 异同与使用详解
发布:smiling 来源: PHP粉丝网 添加日期:2022-05-14 10:51:32 浏览: 评论:0
这篇文章主要介绍了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 父类里面定义的方法与子类有同名冲突的情况,但是,当子类调用的时候,那么自动切换到子类的静态同名方法,取决于调用者。
大家可以通过运行以上两个示例进行理解。
Tags: Class self static
相关文章
- ·PHP 是什么?(2013-11-12)
- ·Php.ini文件位置在哪里 Php.ini文件找不到(2013-11-12)
- ·点击浏览器的后退按钮后,所有字段的信息都被清空了?(2013-11-12)
- ·PHP 数据类型(2013-11-12)
- ·php 获取当前脚本的url(2013-11-12)
- ·php技术生成静态页面的实现(2013-11-13)
- ·缺陷月项目启动 披露PHP脚本语言漏洞(2013-11-13)
- ·在PHP中全面阻止SQL注入式攻击(2013-11-13)
- ·php生成随机密码的几种方法(2013-11-13)
- ·PHP中使用FCKeditor2.3.2配置(2013-11-13)
- ·如何使用PHP开发高效的WEB系统(2013-11-13)
- ·php过滤危险html代码(2013-11-13)
- ·php:树形结构的算法(2013-11-13)
- ·php4和php5区别(2013-11-13)
- ·php数据库连接(2013-11-13)
- ·如何正确理解PHP的错误信息(2013-11-13)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)