是否可以在PHP函数中定义一个局部常量?


Is it possible to define a local constant within a PHP function?

如果能在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通常是全局作用域,前提是您正在使用自动加载器