如何在类中定义常量,并使其仅在类上下文中调用时才可见?
....类似于Foo::app()->MYCONSTANT;
(如果被忽略,则调用MYCONSTANT
)
答案 0 :(得分:113)
请参阅Class Constants:
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"
。
编辑 - 也许您正在寻找的是static properties / variables:
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"
答案 1 :(得分:18)
这是一个古老的问题,但现在在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 Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …
注意:强> 从PHP 7.1.0开始,允许使用类常量的可见修饰符。
更多信息here
答案 2 :(得分:10)
class Foo {
const BAR = 'baz';
}
echo Foo::BAR;
这是制作类常量的唯一方法。这些常量始终可以通过Foo::BAR
全局访问,但只能通过BAR
访问它们。
要实现Foo::baz()->BAR
之类的语法,您需要从类baz()
的函数Foo
返回一个具有属性 {{1}的对象}}。但这并不是一个常数。您定义的任何常量始终可以从任何地方全局访问,并且不能限制为函数调用结果。
答案 3 :(得分: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();
答案 4 :(得分:3)
您可以在php中定义类常量。但是你的类常量也可以从任何对象实例访问。这是php的功能。
但是,从 php7.1 开始,您可以使用访问修饰符(public
,private
或protected
)定义类常量
解决方法是将常量定义为private
或protected
,然后通过static function
使其可读。如果从静态上下文调用,此函数应仅返回常量值。
您还可以在父类中创建此静态函数,并在所有其他类上继承此父类以使其成为默认功能。
致谢:http://dwellupper.io/post/48/defining-class-constants-in-php