PHP-在类中定义常量


Answers:


140

参见类常量

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:不,不是(AFAIK,可能有一些晦涩的方法)。
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

24

这是一个老问题,但是现在在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中的输出:

酒吧

致命错误:未捕获错误:无法在…中访问私有const Foo :: BAZ

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

更多信息在这里


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

echo Foo::BAR;

这是制作类常量的唯一方法。这些常量始终可以通过全局访问Foo::BAR,但不能通过just访问BAR

要实现类似的语法Foo::baz()->BAR,您需要从具有属性baz()的类的函数中返回一个对象。但是,这不是一个常数。您定义的任何常量始终可以从任何地方全局访问,并且不能仅限于函数调用结果。Foo 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,你可以定义你的类常量访问修饰符publicprivateprotected)。

解决方法是将常量定义为privateor protected,然后通过使其可读static function。如果从静态上下文中调用此函数,则仅应返回常量值。

您也可以在父类中创建此静态函数,并仅在所有其他类上继承此父类以使其成为默认功能。

鸣谢:http : //dwellupper.io/post/48/defining-class-constants-in-php

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.