如果能在PHP函数的作用域中定义一个局部常量,那就太好了
这样,任何阅读函数的人都会知道该定义在函数内是最终的,并且不会影响任何外部代码
像这样(语法无效):
public function laughManiacally($count){
const LAUGH = 'HA';
for($i=0;$i<$count;$i++){
echo LAUGH;
}
};
或者可能(同样无效):
...
final $laugh = 'HA';
...
有办法吗?如果不是,为什么不呢?
JavaScript允许块级常量声明的方式类似于我正在搜索的
的功能function laughManiacally(count) {
const LAUGH = 'Ha';
for (let i = 0; i < count; i++) {
console.log(LAUGH);
}
}
echo name_of_class::LAUGH
否则PHP将查找与define()
一起创建的全局常量。
跟踪:
你也可以只在对象级别定义常量,例如
class foo {
const BAR = 'baz'; // valid
function foo() {
const BAR = 'baz'; // invalid. can't define constants INSIDE a method.
}
}
不,PHP中没有函数级常量。最接近的是类常量:
class A
{
const LAUGH = 'HA';
function laughManiacally($count)
{
for ($i=0; $i < $count; ++$i) {
echo static::LAUGH;
}
}
}
$obj = new A();
$obj->laughManiacally(5);
输出:HAHAHAHAHA
我也试过
final $laugh = 'HA';
final
关键字不能用于类属性,只能用于方法
从PHP 7开始,匿名类支持在函数级别提供不可变变量:
# This will work as expected
function fulfill() {
$immutable = new class { const value = 42; };
return $immutable::value;
}
# This will compile, but what would one expect?
function misbehave() {
$immutable = new class { const value = 7; };
$immutable->value = 666;
return $immutable::value;
}
fulfill(); // => 42
misbehave(); // => 7
所以当misbehave
做编译时,它不允许匿名类常量被改变,但是PHP没有产生任何警告或错误:试图改变$immutable::value
只是默默地失败了。
而且,结果的语法至少可以说是非常复杂的。
综上所述,避免广泛使用这个功能可能是更明智的,但它仍然积极地回答了这个问题:是的,PHP允许在函数中定义局部常数。
<标题>相关资源- https://www.simonholywell.com/post/2017/03/php-and-immutability/
- https://www.php.net/manual/en/language.oop5.anonymous.php
- https://wiki.php.net/rfc/immutability
我想你把const
和scope搞混了。
function foo() {
$x = 1;
}
我不需要将$x
声明为const
,因为它已经作用域为foo()
。我必须显式地将其提升到全局作用域才能在其他地方使用它(出于许多原因,这是一个坏主意)。$x
可以修改,但必须在函数内修改,或者编辑代码。
define
设置的常量是全局作用域,const
通常是全局作用域,前提是您正在使用自动加载器