在PHP中如何在类内定义常量?

92

我该如何在类中定义一个常量,并使其仅在类上下文中可见?

类似于 Foo::app()->MYCONSTANT;

(如果像 MYCONSTANT 这样调用,则被忽略)


3
我最近遇到了这个问题 https://dev59.com/d1bTa4cB1Zd3GeqP91ld - Ibu
5个回答

148

请参阅类常量

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
在这种情况下,将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"

但是在类的函数内定义它不起作用 :( - Alex
@Alex:不,它不支持(就我所知,可能有一些晦涩的方法)。 - Alix Axel
3
is_null(self::$staticVariable) === true) && (isset($value) === true)еҸҜд»Ҙжӣҙз®ҖжҙҒең°иЎЁиҫҫдёәself::$staticVariable === null && $value !== nullгҖӮеҮҪж•°еҶ…йғЁе§Ӣз»ҲдјҡеҜ№$valueиҝӣиЎҢи®ҫзҪ®пјҢеӣ жӯӨдёҚйңҖиҰҒдҪҝз”ЁissetгҖӮиҖҢи¶…жҳҺзЎ®зҡ„=== trueжІЎжңүд»»дҪ•ж„Ҹд№үгҖӮ - deceze
1
我们以前有过这个对话吗?情不自禁,我就是真的不喜欢那种风格。;-D - deceze
@deceze:是的。我非常习惯这种风格,它对我很有效,所以我会坚持使用它,但你也是对的。=) - Alix Axel

21

这是一个老问题,但是现在在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;
?>

以上 PHP 7.1 示例的输出:

bar

致命错误: 无法访问私有常量 Foo::BAZ in …

注意: 自 PHP 7.1.0 起,类常量允许使用可见性修饰符。

更多信息请在此处查看。


13
class Foo {
    const BAR = 'baz';
}

echo Foo::BAR;

这是创建类常量的唯一方法。这些常量可以通过Foo::BAR全局访问,但不能仅通过BAR访问。

要实现像Foo::baz()->BAR这样的语法,您需要从Foo类的baz()函数返回一个对象,该对象具有一个名为BAR属性。但那不是常量。您定义的任何常量都可以在任何地方全局访问,无法限制为函数调用结果。


6

这是一个相当老的问题,但也许这个答案仍然可以帮助其他人。

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

class Foo {

    // This is a private constant
    final public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

方法前的final关键字可以防止继承类重新定义该方法。 你还可以在类声明前加上final关键字,这样就可以防止类被继承。

要几乎完全得到Alex想要的结果,可以使用以下代码:

final class Constants {

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

class Foo {

    static public app()
    {
        return new Constants();
    }
}

模拟的常量值可以通过以下方式进行访问:
Foo::app()->MYCONSTANT();

3
您可以在PHP中定义类常量。但是,您的类常量也可以从任何对象实例中访问。这是PHP的功能。 然而,从php7.1开始,您可以使用访问修饰符(public、private或protected)定义类常量。
一个解决方法是将常量定义为private或protected,然后通过静态函数使它们可读取。只有在静态上下文中调用该函数时,它才应返回常量值。
您还可以在父类中创建此静态函数,并简单地继承此父类到所有其他类中,以使其成为默认功能。
来源:http://dwellupper.io/post/48/defining-class-constants-in-php

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接