我的应用程序中有一个bug,我根本不理解。我做了一个最小的例子,再现了这个问题:
<?php
class MyClass {
const ITEMS_PER_STACK = 30;
public function test(): int {
global $ITEMS_PER_STACK;
return $ITEMS_PER_STACK;
}
}
$a = new MyClass();
echo($a->test());
预期的行为是输出30,而实际上它抛出一个空异常,因为全局变量不能被访问。有人能向我解释一下为什么会发生这种情况以及如何解决这个问题吗?非常感谢,谢谢。
如果按照您指示的方式声明ITEMS_PER_STACK
,则从类内部引用它的方式是使用self::ITEMS_PER_STACK
。
:
<?php
class MyClass {
const ITEMS_PER_STACK = 30;
public function test(): int {
return self::ITEMS_PER_STACK;
}
}
$a = new MyClass();
echo($a->test());
参见:类常量
您可以使用global
关键字强制使用类外某处声明的变量,如下所示:
<?php
$outside_variable = 999;
class MyClass {
const ITEMS_PER_STACK = 30;
public function test(): int {
return self::ITEMS_PER_STACK;
}
public function testGlobal(): int {
global $outside_variable;
return $outside_variable;
}
}
$a = new MyClass();
echo($a->testGlobal());
参见:PHP中的全局作用域
虽然上面的答案确实告诉了你解决办法,但这不是正确的方法。
非常不鼓励使用全局变量,这会导致应用程序中出现大量的bug和奇怪现象。
使用常量的初始方法是正确的,但是你需要通过引用它所在的类来调用它,如果它不在同一个类中(你使用self::ITEMS_PER_STACK
),按照上面的答案。
如果你想在另一个类中使用这个常量,只需在它所在的类名前加上前缀。
<?php
class MyClass {
const ITEMS_PER_STACK = 30;
}
echo MyClass::ITEMS_PER_STACK;
还请注意,从PHP 7.1开始,您可以添加常量的可见性,例如:
public const ITEMS_PER_STACK = 30;
参见例#4https://www.php.net/manual/en/language.oop5.constants.php