PHP中类名加双冒号的作用

在 PHP 中,类名加双冒号(:: 是一种用于访问类的静态成员常量 的语法。它也可以用来调用类的静态方法 和访问 PHP 的类相关关键词 (如 parentselfstatic)。以下是详细的解释和用法。


1. 用途概述

:: 被称为作用域解析操作符(Scope Resolution Operator),主要有以下作用:

1.1 访问静态属性

可以通过类名访问静态变量,而不需要实例化类。

php 复制代码
class MyClass {
    public static $staticVar = "Hello, World!";
}

// 访问静态属性
echo MyClass::$staticVar; // 输出: Hello, World!

1.2 调用静态方法

静态方法属于类本身,而不是类的实例。通过 类名::方法名 调用。

php 复制代码
class MyClass {
    public static function staticMethod() {
        return "This is a static method.";
    }
}

// 调用静态方法
echo MyClass::staticMethod(); // 输出: This is a static method.

1.3 访问类常量

类常量通过 const 定义,不能改变值,可以用 :: 访问。

php 复制代码
class MyClass {
    const CONSTANT_VALUE = 42;
}

// 访问常量
echo MyClass::CONSTANT_VALUE; // 输出: 42

1.4 特殊关键词的使用

self::

self:: 用于访问当前类的静态属性、方法或常量,而不考虑继承关系。

php 复制代码
class ParentClass {
    const CONSTANT = "Parent Constant";

    public static function showConstant() {
        return self::CONSTANT; // 访问当前类的常量
    }
}

class ChildClass extends ParentClass {
    const CONSTANT = "Child Constant";
}

echo ChildClass::showConstant(); // 输出: Parent Constant

解释 :即使 ChildClass 继承了 ParentClassself:: 始终指向定义 showConstant() 的类(即 ParentClass)。

parent::

parent:: 用于调用父类的方法或访问父类的属性。

php 复制代码
class ParentClass {
    public static function parentMethod() {
        return "This is a parent method.";
    }
}

class ChildClass extends ParentClass {
    public static function childMethod() {
        return parent::parentMethod(); // 调用父类的方法
    }
}

echo ChildClass::childMethod(); // 输出: This is a parent method.
static::

static:: 是 PHP 的后期绑定机制,用于访问当前调用类(而不是定义类)的静态成员。

php 复制代码
class ParentClass {
    public static function who() {
        return "ParentClass";
    }

    public static function test() {
        return static::who(); // 后期绑定
    }
}

class ChildClass extends ParentClass {
    public static function who() {
        return "ChildClass";
    }
}

echo ParentClass::test(); // 输出: ParentClass
echo ChildClass::test(); // 输出: ChildClass

解释static:: 根据实际调用的类来决定绑定的目标,而不是方法定义的类。


1.5 使用类名访问匿名类

匿名类的名字可以通过 类名::class 获取。

php 复制代码
$classInstance = new class {
    public static function sayHello() {
        return "Hello from anonymous class!";
    }
};

echo get_class($classInstance); // 输出: 类名(如 class@anonymous)

2. 小结

  • 静态成员访问类名::属性名类名::方法名
  • 访问常量类名::常量名
  • 特殊关键词
    • self:::指向当前类。
    • parent:::指向父类。
    • static:::后期绑定,用于动态调用。
  • 获取类名类名::class

:: 操作符主要用于访问类的静态上下文 。如果需要访问对象的非静态成员,则需要使用 对象操作符 ->

相关推荐
好奇龙猫8 分钟前
【人工智能学习-AI-MIT公开课13.- 学习:遗传算法】
android·人工智能·学习
掉鱼的猫11 分钟前
灵动如画 —— 初识 Solon Graph Fluent API 编排
java·openai·workflow
TO_ZRG11 分钟前
Unity打包安卓、iOS知识点
android·unity·android studio
周杰伦fans13 分钟前
AndroidStudioJava国内镜像地址gradle
android·java·android-studio
艾莉丝努力练剑13 分钟前
【Linux进程控制(一)】进程创建是呼吸,进程终止是死亡,进程等待是重生:进程控制三部曲
android·java·linux·运维·服务器·人工智能·安全
2501_9240641115 分钟前
2026年移动应用渗透测试流程方案及iOS与Android框架对比
android·ios
用户693717500138418 分钟前
谷歌官方推荐:Android 性能优化全攻略——从工具到实战,两周提升 App 评分
android·android studio·android jetpack
顾林海19 分钟前
Android Profiler实战宝典:揪出CPU耗时元凶与内存泄露小偷
android·面试·性能优化
城东米粉儿19 分钟前
Android刷新与绘制机制详解 笔记
android
天天摸鱼的java工程师20 分钟前
RocketMQ 与 Kafka 对比:消息队列选型的核心考量因素
java·后端