在 PHP 中,类名加双冒号(::
) 是一种用于访问类的静态成员和常量的语法。它也可以用来调用类的静态方法和访问 PHP 的类相关关键词(如 parent
、self
和 static
)。以下是详细的解释和用法。
1. 用途概述
::
被称为作用域解析操作符(Scope Resolution Operator),主要有以下作用:
1.1 访问静态属性
可以通过类名访问静态变量,而不需要实例化类。
class MyClass {public static $staticVar = "Hello, World!";
}// 访问静态属性
echo MyClass::$staticVar; // 输出: Hello, World!
1.2 调用静态方法
静态方法属于类本身,而不是类的实例。通过 类名::方法名
调用。
class MyClass {public static function staticMethod() {return "This is a static method.";}
}// 调用静态方法
echo MyClass::staticMethod(); // 输出: This is a static method.
1.3 访问类常量
类常量通过 const
定义,不能改变值,可以用 ::
访问。
class MyClass {const CONSTANT_VALUE = 42;
}// 访问常量
echo MyClass::CONSTANT_VALUE; // 输出: 42
1.4 特殊关键词的使用
self::
self::
用于访问当前类的静态属性、方法或常量,而不考虑继承关系。
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
继承了ParentClass
,self::
始终指向定义showConstant()
的类(即ParentClass
)。
parent::
parent::
用于调用父类的方法或访问父类的属性。
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 的后期绑定机制,用于访问当前调用类(而不是定义类)的静态成员。
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
获取。
$classInstance = new class {public static function sayHello() {return "Hello from anonymous class!";}
};echo get_class($classInstance); // 输出: 类名(如 class@anonymous)
2. 小结
- 静态成员访问:
类名::属性名
或类名::方法名
。 - 访问常量:
类名::常量名
。 - 特殊关键词:
self::
:指向当前类。parent::
:指向父类。static::
:后期绑定,用于动态调用。
- 获取类名:
类名::class
。
::
操作符主要用于访问类的静态上下文。如果需要访问对象的非静态成员,则需要使用 对象操作符 ->
。