20

C++ 预处理器#define完全不同。

PHPdefine()与仅仅创建一个var有什么不同吗?

define("SETTING", 0);  
$something = SETTING;

对比

$setting = 0;  
$something = $setting;
4

10 回答 10

17

'define' 操作本身相当慢 - 由 xdebug profiler 确认。

这是来自http://t3.dotgnu.info/blog/php/my-first-php-extension.html的基准:

  • 纯 'define'
    380.785 fetches/sec
    14.2647 mean ms/first-response

  • 用'hidef'扩展定义的常量 930.783
    fetches/sec
    6.30279 mean ms/first-response


断链更新

上面引用的博文已离开互联网。它仍然可以通过 Wayback Machine 在这里查看。这是另一篇类似的文章

作者引用的库可以在此处 (apc_define_constants)此处 (hidef extension)找到。

于 2010-03-16T21:25:40.640 回答
5

一般来说,常量的想法是在你的程序中保持常量,(听起来很有趣,对吧?;))。这意味着编译器(解释器)将在整个脚本中用 FOOBAR 的值替换“FOOBAR”。

理论和优势就这么多——如果你编译的话。现在 PHP 是非常动态的,在大多数情况下您不会注意到有什么不同,因为每次运行都会编译 PHP 脚本。Afai 可以告诉您,除非您使用APCZend OptimizereAccelerator等字节码缓存,否则常量和变量之间的速度不会有显着差异。那么它就有意义了。

常量的所有其他优点/缺点已在此处注明,并可在PHP 手册中找到。

于 2008-09-29T10:36:54.247 回答
5
php > $cat='';$f=microtime(1);$s='cowcow45';$i=9000;while ($i--){$cat.='plip'.$s.'cow';}echo microtime(1)-$f."\n";

0.00689506530762

php > $cat='';$f=microtime(1);define('s','cowcow45');$i=9000;while ($i--){$cat.='plip'.s.'cow';}echo microtime(1)-$f."\n";

0.00941896438599

这是可重复的,结果相似。在我看来,常量的定义和/或使用比变量慢一些。

于 2009-12-04T01:02:03.900 回答
4

以下是手册中的差异

  • 常量前面没有美元符号 ($);
  • 常量只能使用 define() 函数来定义,不能通过简单的赋值;
  • 可以在任何地方定义和访问常量,而无需考虑变量范围规则;
  • 常量一旦被设置就不能被重新定义或取消定义;和
  • 常量只能计算为标量值。

对我来说,主要的好处是全局范围。我当然不担心它们的效率——只要你需要一个不应该改变的全局标量值,就可以使用它们。

于 2008-09-29T10:23:02.080 回答
3

它似乎没有效率。(我在这里的所有假设都基于 php.net 的一条评论,我自己还没有做过基准测试。)

调用一个常数,需要 2 倍于调用一个变量的时间。

检查常量的存在将需要 2ms 和 12ms 的误报!

这是来自 php 在线文档中定义页面的评论的基准。

在使用 defined() 之前,请查看以下基准:

true                                       0.65ms
$true                                      0.69ms (1)
$config['true']                            0.87ms
TRUE_CONST                                 1.28ms (2)
true                                       0.65ms
defined('TRUE_CONST')                      2.06ms (3)
defined('UNDEF_CONST')                    12.34ms (4)
isset($config['def_key'])                  0.91ms (5)
isset($config['undef_key'])                0.79ms
isset($empty_hash[$good_key])              0.78ms
isset($small_hash[$good_key])              0.86ms
isset($big_hash[$good_key])                0.89ms
isset($small_hash[$bad_key])               0.78ms
isset($big_hash[$bad_key])                 0.80ms

PHP 版本 5.2.6、Apache 2.0、Windows XP

每条语句都执行了 1000 次,虽然 1000 次调用的 12 毫秒开销不会让最终用户大吃一惊,但与 if(true) 相比,它确实会产生一些有趣的结果:

1) if($true) 几乎相同 2) if(TRUE_CONST) 几乎慢了一倍 - 我猜替换不是在编译时完成的(我必须仔细检查这个!) 3) defined() 是如果常量存在则慢 3 倍 4) 如果常量不存在,defined() 会慢 19 倍!5) isset() 非常高效,不管你扔什么(对于任何实现数组驱动事件系统的人来说都是个好消息——我!)

可能想避免 if(defined('DEBUG'))...

来自 tfconsulting dot com dot au 的 tris+php 2009 年 3 月 26 日 06:40

http://us.php.net/manual/en/function.defined.php#89886

于 2012-04-11T01:16:09.747 回答
1

定义是简单的静态意义,这意味着它的值在运行时不能改变,而变量是动态意义,因为你可以在过程中自由地操纵它的值。

于 2011-07-26T06:22:27.730 回答
0

当我运行速度测试时,设置和转储的常量比设置变量和转储要快得多。

于 2008-12-01T07:09:03.290 回答
0

2020 年更新(PHP 7.2、AMD Ryzen9、Zend OpCache 已启用)

摘要:重新定义相同的常数很慢。检查和定义常量与 $_GLOBALS 相比要慢 8 倍,检查未定义的常量稍微慢一些。不要使用全局变量。

  • 注意:自动加载器和需要一次长路径可能比定义的问题大得多。(需要一次需要 php 来 stat(2) 路径中的每个目录来检查符号链接,这可以通过使用文件的完整路径来减少,因此 PHP 加载器只需 stat 文件路径 1x 并且可以使用 stat 缓存)

代码:

$loops = 90000;
$m0 = microtime(true);
for ($i=0; $i<$loops; $i++) {
   define("FOO$i", true);
}
$m1 = microtime(true);
echo "Define new const {$loops}s: (" . ($m1-$m0) . ")\n";
// etc...

输出:

Define new const 90000s: (0.012847185134888)
Define same const 90000s: (0.89289903640747)
Define same super global 90000s: (0.0010528564453125)
Define new super global 90000s: (0.0080759525299072)
check same undefined 90000s: (0.0021710395812988)
check same defined 90000s: (0.00087404251098633)
check different defined 90000s: (0.0076708793640137)
于 2020-05-17T18:40:30.727 回答
-1

主要区别:

  • 定义是常量,变量是变量
  • 他们不同的范围/可见性
于 2008-09-29T10:25:16.397 回答
-3

不确定效率,但它不仅仅是创建一个var:

  • 它是一个常数:您不能重新定义或重新分配此设置。
  • 如果未找到定义,则将 $something 设置为“SETTING”,这很有用,例如在 i18n 中:如果缺少翻译(即对应的定义是本地化文件),我们会在大写,很明显...
于 2008-09-29T10:25:25.757 回答