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 …