PHP - 在类中定义常量

Ale*_*lex 79 php class constants

如何在类中定义常量,并使其仅在类上下文中调用时才可见?

....就像是 Foo::app()->MYCONSTANT;

(如果被称为MYCONSTANT被忽略)

Ali*_*xel 123

请参见类常量:

class MyClass
{
    const MYCONSTANT = 'constant value';

    function showConstant() {
        echo  self::MYCONSTANT. "\n";
    }
}

echo MyClass::MYCONSTANT. "\n";

$classname = "MyClass";
echo $classname::MYCONSTANT. "\n"; // As of PHP 5.3.0

$class = new MyClass();
$class->showConstant();

echo $class::MYCONSTANT."\n"; // As of PHP 5.3.0
Run Code Online (Sandbox Code Playgroud)

在这种情况下,回显MYCONSTANT本身会引发关于未定义常量的通知,并输出转换为字符串的常量名称:"MYCONSTANT".


编辑 - 也许你正在寻找的是这个静态属性/变量:

class MyClass
{
    private static $staticVariable = null;

    public static function showStaticVariable($value = null)
    {
        if ((is_null(self::$staticVariable) === true) && (isset($value) === true))
        {
            self::$staticVariable = $value;
        }

        return self::$staticVariable;
    }
}

MyClass::showStaticVariable(); // null
MyClass::showStaticVariable('constant value'); // "constant value"
MyClass::showStaticVariable('other constant value?'); // "constant value"
MyClass::showStaticVariable(); // "constant value"
Run Code Online (Sandbox Code Playgroud)

  • `(is_null(self :: $ staticVariable)=== true)&&(isset($ value)=== true)`将更加简洁,因为`self :: $ staticVariable === null && $ value!== null`.`$ value`将始终在函数内部*set*,因此不需要使用`isset`.超显式的`=== true`不会添加任何东西. (2认同)

mat*_*iti 20

这是一个古老的问题,但现在在PHP 7.1上,您可以定义持续可见性.

<?php
class Foo {
    // As of PHP 7.1.0
    public const BAR = 'bar';
    private const BAZ = 'baz';
}
echo Foo::BAR . PHP_EOL;
echo Foo::BAZ . PHP_EOL;
?>
Run Code Online (Sandbox Code Playgroud)

在PHP 7.1中输出上述示例:

bar

Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …

注意: 从PHP 7.1.0开始,类常量允许使用可见性修饰符.

更多信息在这里


dec*_*eze 10

class Foo {
    const BAR = 'baz';
}

echo Foo::BAR;
Run Code Online (Sandbox Code Playgroud)

这是制作类常量的唯一方法.这些常量总是可以通过全局访问Foo::BAR,但它们不能仅通过它访问BAR.

要实现类似的语法Foo::baz()->BAR,您需要从具有属性baz()的类的函数返回一个对象.但这并不是一个常数.您定义的任何常量始终可以从任何位置全局访问,并且不能限制为函数调用结果.Foo BAR


小智 6

这是一个非常古老的问题,但也许这个答案仍然可以帮助其他人.

您可以通过将final关键字应用于返回预定义值的方法来模拟在类范围内受限制的公共常量,如下所示:

class Foo {

    // This is a private constant
    final public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}
Run Code Online (Sandbox Code Playgroud)

方法上的final关键字可防止扩展类重新定义方法.您还可以将final关键字放在类声明的前面,在这种情况下,关键字会阻止类继承.

为了得到Alex正在寻找的东西,可以使用以下代码:

final class Constants {

    public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

class Foo {

    static public app()
    {
        return new Constants();
    }
}
Run Code Online (Sandbox Code Playgroud)

模拟的常量值可以像这样访问:

Foo::app()->MYCONSTANT();
Run Code Online (Sandbox Code Playgroud)