【发布时间】:2011-08-19 00:46:00
【问题描述】:
如何在类中定义常量,并使其仅在类上下文中调用时可见?
....类似于Foo::app()->MYCONSTANT;
(如果像 MYCONSTANT 一样调用将被忽略)
【问题讨论】:
-
我最近遇到了这个问题stackoverflow.com/q/5710676/560299
如何在类中定义常量,并使其仅在类上下文中调用时可见?
....类似于Foo::app()->MYCONSTANT;
(如果像 MYCONSTANT 一样调用将被忽略)
【问题讨论】:
这是一个老问题,但现在在 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 in ...注意: 自 PHP 7.1.0 起,类常量允许使用可见性修饰符。
更多信息here
【讨论】:
你可以在 php.ini 中定义一个类常量。但是您的类常量也可以从任何对象实例访问。这是php的功能。
但是,从 php7.1 开始,您可以使用 访问修饰符(public、private 或 protected)定义您的类常量。
解决方法是将常量定义为private 或protected,然后通过static function 使它们可读。如果从静态上下文中调用,该函数应该只返回常量值。
你也可以在你的父类中创建这个静态函数,然后简单地在所有其他类上继承这个父类,使其成为默认功能。
致谢:http://dwellupper.io/post/48/defining-class-constants-in-php
【讨论】:
这是一个相当古老的问题,但也许这个答案仍然可以帮助其他人。
您可以通过将 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();
【讨论】:
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 会引发关于未定义常量的通知,并将 constant 名称转换为字符串:"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"
【讨论】:
(is_null(self::$staticVariable) === true) && (isset($value) === true) 会比self::$staticVariable === null && $value !== null 更简洁。 $value 将始终在函数内部设置,因此无需使用isset。而超显式的=== true 并没有添加任何东西。
class Foo {
const BAR = 'baz';
}
echo Foo::BAR;
这是制作类常量的唯一方法。这些常量始终可以通过Foo::BAR 全局访问,但不能仅通过BAR 访问。
要实现类似Foo::baz()->BAR 的语法,您需要从Foo 类的函数baz() 返回一个对象,该对象具有属性 BAR。不过,这不是一个常数。您定义的任何 constant 始终可以从任何地方全局访问,并且不能仅限于函数调用结果。
【讨论】: