PHP-在类中定义常量

PHP-在类中定义常量,php,class,constants,Php,Class,Constants,如何在类中定义常量,并使其仅在类上下文中调用时可见 …类似于Foo::app()->MYCONSTANT (如果像MYCONSTANT一样调用,将被忽略)请参见: 在这种情况下,单独回显MYCONSTANT将引起关于未定义常量的通知,并将常量名称转换为字符串:“MYCONSTANT” 编辑-也许您正在寻找的是: 这是生成类常量的唯一方法。这些常量始终可以通过Foo::BAR全局访问,但不能仅通过BAR访问 要实现类似于Foo::baz()->BAR的语法,您需要从类Foo的函数baz()返回一

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

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

(如果像MYCONSTANT一样调用,将被忽略)

请参见:

在这种情况下,单独回显
MYCONSTANT
将引起关于未定义常量的通知,并将常量名称转换为字符串:
“MYCONSTANT”


编辑-也许您正在寻找的是:

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


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

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

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

class Foo {

    // This is a private constant
    final public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}
Foo::app()->MYCONSTANT();
方法上的final关键字阻止扩展类重新定义该方法。 您还可以将final关键字放在类声明的前面,在这种情况下,关键字会阻止类继承

要获得Alex想要的内容,可以使用以下代码:

final class Constants {

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

class Foo {

    static public app()
    {
        return new Constants();
    }
}
模拟常量值的访问方式如下:

class Foo {

    // This is a private constant
    final public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}
Foo::app()->MYCONSTANT();

这是一个古老的问题,但现在在PHP7.1上可以定义常量可见性

示例


PHP 7.1中上述示例的输出:

bar Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in … 酒吧 致命错误:未捕获错误:无法访问… 注意: 从PHP7.1.0开始,类常量允许使用可见性修饰符


更多信息

您可以在php中定义类常量。但是您的类常量也可以从任何对象实例访问。这就是php的功能。 但是,从php7.1开始,您可以使用访问修饰符(
public
private
protected
)定义类常量

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

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


信用证:

但是在类的函数中定义它是不起作用的:(@Alex:No它不起作用(好吧,可能有一些模糊的方法)。
(是null(self::$staticVariable)==true)和&(isset($value)==true)
将更加简洁,因为
self::$staticVariable===null&&$value!==null
$value
将始终在函数内部设置,因此无需使用
isset
。超显式
==true
没有添加任何内容。我们以前有过这个对话吗?没办法,我只是真的不喜欢这个伊尔-D@deceze:是的。我非常习惯这种风格,它对我很管用,所以我会坚持下去,但你也是对的。=)我最近有这个问题
<?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;
?>
bar Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …