我该如何改变PHP常量?

6

我正在手工制作自己的PHP定制CMS,我定义了一些常量。有没有简便的方法来修改这些常量?

我在考虑使用fopen()这样的函数进行更改,但我从未使用过文件系统函数。


11
你可能需要重新查阅“constant”的字典定义。 - BoltClock
4
为什么需要更改常量?如果它们在代码中不是恒定的,请使用变量。 - Tom
2
常量就是常量 - 你不能修改它们。当然,如果你说的是define('constant_name', 'constant_value');,那么请举个例子解释一下,因为看起来你试图谈论如何通过PHP脚本重写CMS配置文件中的配置参数。 - Cheery
1
我知道常量的含义,但我想知道是否有一种方法可以更改它们或类似的操作。我不想通过 PHP 文件手动编辑它们。很抱歉我想错了。 - legobear154
3
也许他并不想在实际运行时修改它们,而是想将它们用作他的 CMS 的配置文件,并希望他的安装脚本来修改它们?(仍然不是一个好的解决方案,只是可能能让问题更加清晰易懂。) - Corbin
8个回答

26
常量是一个简单值的标识符(名称)。正如其名称所示,在脚本执行期间该值不能更改(除了魔术常量,它们实际上不是常量)。默认情况下,常量对大小写敏感。按照惯例,常量标识符始终大写。常量的名称遵循与PHP中任何标签相同的规则。有效的常量名称以字母或下划线开头,后跟任意数量的字母、数字或下划线。作为正则表达式,它将被表示为:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*。摘自:Constants (PHP手册)。

8
无法比 PHP 官网更好地表达! - Tech4Wilco

15

常量是恒定的,因此无法更改。 如果您想更改服务器常量,例如allow_url_fopen,那就是主机的责任。请向他们询问。

如果要在PHP中更改它们,请使用变量。

如果事实就像Corbin所说,并且您想在安装中修改它们,则需要执行以下操作:1.将常量值更改为%%constant1,例如。2.将代码读入变量中。3.让用户设置变量。4.对所有变量使用str_replace("%%constant1", $_POST["value1"], $configfile)等函数。5.将$configfile添加为文件的内容。

对于您自己的CMS,我建议将所有常量存储在一个文件中,这样您只需要编辑一个文件即可。也许之前的解决方案可以用于更轻松的编辑,但我不知道是否值得花时间。


14
不。它们是“常量”,即“constant - 永久或不变的”(维基词典)。一旦定义,就无法更改它们。引用The Fine Manual中的“常量”章节:
"[常量的]值在脚本执行期间无法更改。"

对于我的错误表示抱歉... 对我来说,常量只是一个可以在整个站点中使用而无需不断定义的值。我应该更清楚地表达我想要实现的目标。我正在为自己创建自己使用的CMS,我想知道如何创建一种方法来更改变量或任何一个好的术语,而无需手动编辑包含它们的文件/文件。对不起。 - legobear154
不需要为错误道歉,每个人都会犯错 :) - Piskvor left the building
好的。创建配置文件的最佳方式是什么?我将在我的CMS中添加一个管理面板,并希望从那里编辑变量。 - legobear154

6

不可以修改常量。


1
那个语句需要限定。在运行时?eval()呢? - Peter Mortensen

1

我认为OP的意思是在安装脚本的情况下,OP想要将输入变量存储到配置文件中,在安装完成后在OP的CMS中使用。

在这种情况下,OP并没有在运行时更改常量。

OP可能得到了像这样的文件:

define(DB, '');
define(USER, '');
define(PASS, '');
define(HOST, '');

而且 OP 想要创建一个脚本来填充这些常量的数据,以便在 CMS 中使用。


1
在PHP中,但仅当您安装了runkit扩展时才能使用。
然而,我必须质疑为什么您要定义一个常量,如果需要更改它。一旦更改,它将不再是常量,并且如果需要更改,则在您的上下文中使用常量是适当的。如果需要在其他函数或代码部分中访问它,您可以考虑将其作为全局变量,或者编写适当的代码:
以参数的形式将数据传递给函数,然后返回操作过的值(如果以过程化方式编码)。
将值设置为类的属性,然后在类内使用$this访问该值(如果以面向对象(OO)方式编码)。

0
据我所知,一旦设置了常量,就无法更改。

那个语句需要进行限定。是在运行时?那么 eval() 呢? - Peter Mortensen

0

常量意味着其值是恒定不变的,因此您无法更改常量。如果您需要更改常量,则需要使用变量而不是常量:

define('ROOT', '/some/path');
echo ROOT; // Echoes /some/path
define('ROOT', '/some/other/path'); // Gives an error
echo ROOT; // Gives /some/path (if there were no error

$root = '/some/path';
echo $root; // Echoes /some/path
$root = '/some/other/path';
echo $root; // Echoes /some/other/path

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接