一、简介
PHP范围解析操作符(也被称为 Paamayim Nekudotayim)或者更简单地说,是一对冒号。它可以用于访问静态成员、类常量,还可以用于覆盖类中的属性和方法。本教程将详细介绍在不同方面使用范围解析操作符的方法。
在类的外部引用类成员时,需要使用类名来指定这些成员。此时,如果通过变量进行引用,那么这个变量的命名不能使用保留关键字,例如 self、parent 或 static。
关于双冒号操作符的命名选择“Paamayim Nekudotayim”确实显得不同寻常。这个名称源自Zend开发团队在创建Zend Engine 0.5版(PHP 3所采用的引擎)时做出的一个有趣的决定。在希伯来语中,“Paamayim Nekudotayim”正是双冒号的含义。
二、在类的外部使用
在类的外部使用 :: 操作符,实例:
<?php class MyClass { const CONST_VALUE = 'A constant value'; } $classname = 'MyClass'; echo $classname::CONST_VALUE; echo MyClass::CONST_VALUE; ?>
self,parent 和 static 这三个特殊的关键字是用于在类定义的内部对其属性或方法进行访问的。
三、在类定义内部使用
在类定义内部使用 ::操作符,实例:
<?php class OtherClass extends MyClass { public static $my_static = 'static var'; public static function doubleColon() { echo parent::CONST_VALUE . "\n"; echo self::$my_static . "\n"; } } $classname = 'OtherClass'; $classname::doubleColon(); OtherClass::doubleColon(); ?>
当一个子类覆盖其父类中的方法时,PHP 不会调用父类中已被覆盖的方法。是否调用父类的方法取决于子类。这种机制也作用于构造函数和析构函数,重载以及魔术方法。
三、调用父类的方法
调用父类的方法实例:
<?php class MyClass { protected function myFunc() { echo "MyClass::myFunc()\n"; } } class OtherClass extends MyClass { // 覆盖了父类的定义 public function myFunc() { // 但还是可以调用父类中被覆盖的方法 parent::myFunc(); echo "OtherClass::myFunc()\n"; } } $class = new OtherClass(); $class->myFunc(); ?>
这段PHP代码定义了两个类:MyClass 和 OtherClass。OtherClass 继承自 MyClass。在 MyClass 中定义了一个受保护的方法 myFunc(),这意味着该方法不能从类外部调用,但可以在派生类中被访问。