一、概述
在PHP中,可以将类中的常量定义为始终不变的值,这些常量在整个类中都可以被访问和使用,因此它们具有全局作用域。
注意:
- PHP 类常量的默认可见性是 public 。
- 另外类常量还可以通过子类重新定义。PHP 8.1.0 起,如果类常量定义为 final,则不能被子类重新定义。
- 接口(interface)中也可以定义常量。
- 可以用一个变量来动态调用类。但该变量的值不能为关键字(如 self , parent 或 static)。
- 类常量只为每个类分配一次,而不是为每个类的实例分配。
二、定义和使用一个类常量
<?<a href="https://www.zzbaike.com/tag/php" title="查看所有文章关于 php" target="_blank">php</a>
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";
?>
<?<a href="https://www.zzbaike.com/tag/php" title="查看所有文章关于 php" target="_blank">php</a>
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";
?>
<?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
namespace foo {
class bar {
}
echo bar::class; // foo\bar
}
?>
<?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
const ONE = 1;
class foo {
const TWO = ONE * 2;
const THREE = ONE + self::TWO;
const SENTENCE = 'The value of THREE is '.self::THREE;
}
?>
<?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
class Foo {
public const BAR = 'bar';
private const BAZ = 'baz';
}
echo Foo::BAR, PHP_EOL;
echo Foo::BAZ, PHP_EOL;
?>
<?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 …
bar
Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …
bar Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …