繁体   English   中英

是否可以在 PHP function 中定义局部常量?

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

能够在 PHP 中的 function 的 scope 中定义局部常量可能会很好

这样,任何阅读 function 的人都会知道该定义在 function 中是最终的,并且不会影响任何外部代码

像这样的东西(无效的语法):

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关键字不能应用于类属性 - 只能应用于方法。

我认为您在这里将const与范围混淆了。

function foo() {
    $x = 1;
}

我不需要将$x声明为const因为它已经被限定为foo() 我必须明确地将它提升到全局范围才能在其他地方使用它(出于多种原因,这是一个坏主意)。 $x可以更改,但前提是您在函数中这样做或编辑代码。

具有讽刺意味的是,使用define设置的常量是全局范围的, const通常是全局的,前提是您使用的是自动加载器

从 PHP 7 开始,匿名类能够提供以某种方式在 function 级别范围内的不可变变量:

# 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确实编译,但它不允许更改匿名 class 常量,但 PHP 没有生成任何警告或错误:更改$immutable::value的尝试只是默默地失败了。

此外,至少可以说,由此产生的语法非常复杂。

考虑到所有这些,避免广泛使用此工具很可能更明智,但它仍然积极地回答了这个问题:是的,PHP 允许在 function 中定义局部常数。

相关资源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM