一、概述
在PHP中,可以将类中的常量定义为始终不变的值,这些常量在整个类中都可以被访问和使用,因此它们具有全局作用域。
注意:
- PHP 类常量的默认可见性是 public 。
- 另外类常量还可以通过子类重新定义。PHP 8.1.0 起,如果类常量定义为 final,则不能被子类重新定义。
- 接口(interface)中也可以定义常量。
- 可以用一个变量来动态调用类。但该变量的值不能为关键字(如 self , parent 或 static)。
- 类常量只为每个类分配一次,而不是为每个类的实例分配。
二、定义和使用一个类常量
<?php class MyClass { const CONSTANT = 'constant value'; function showConstant() { echo self::CONSTANT . "\n"; } } echo MyClass::CONSTANT . "\n"; $classname = "MyClass"; echo $classname::CONSTANT . "\n"; $class = new MyClass(); $class->showConstant(); echo $class::CONSTANT."\n"; ?>
特殊的 ::class 允许在编译时进行完全限定的类名解析, 特别是在命名空间类中。
三、命名空间的 ::class
<?php namespace foo { class bar { } echo bar::class; // foo\bar } ?>
四、类常量表达式
<?php const ONE = 1; class foo { const TWO = ONE * 2; const THREE = ONE + self::TWO; const SENTENCE = 'The value of THREE is '.self::THREE; } ?>
五、可见性修饰符
自 PHP 7.1.0 起,类常量支持可见性修饰符。
<?php class Foo { public const BAR = 'bar'; private const BAZ = 'baz'; } echo Foo::BAR, PHP_EOL; echo Foo::BAZ, PHP_EOL; ?>
以上示例在 PHP 7.1 中的输出:
bar Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …