C++ 预处理器#define
完全不同。
PHPdefine()
与仅仅创建一个var有什么不同吗?
define("SETTING", 0);
$something = SETTING;
对比
$setting = 0;
$something = $setting;
C++ 预处理器#define
完全不同。
PHPdefine()
与仅仅创建一个var有什么不同吗?
define("SETTING", 0);
$something = SETTING;
对比
$setting = 0;
$something = $setting;
'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)找到。
一般来说,常量的想法是在你的程序中保持常量,(听起来很有趣,对吧?;))。这意味着编译器(解释器)将在整个脚本中用 FOOBAR 的值替换“FOOBAR”。
理论和优势就这么多——如果你编译的话。现在 PHP 是非常动态的,在大多数情况下您不会注意到有什么不同,因为每次运行都会编译 PHP 脚本。Afai 可以告诉您,除非您使用APC、Zend Optimizer或eAccelerator等字节码缓存,否则常量和变量之间的速度不会有显着差异。那么它就有意义了。
常量的所有其他优点/缺点已在此处注明,并可在PHP 手册中找到。
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
这是可重复的,结果相似。在我看来,常量的定义和/或使用比变量慢一些。
以下是手册中的差异
对我来说,主要的好处是全局范围。我当然不担心它们的效率——只要你需要一个不应该改变的全局标量值,就可以使用它们。
它似乎没有效率。(我在这里的所有假设都基于 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
定义是简单的静态意义,这意味着它的值在运行时不能改变,而变量是动态意义,因为你可以在过程中自由地操纵它的值。
当我运行速度测试时,设置和转储的常量比设置变量和转储要快得多。
2020 年更新(PHP 7.2、AMD Ryzen9、Zend OpCache 已启用)
摘要:重新定义相同的常数很慢。检查和定义常量与 $_GLOBALS 相比要慢 8 倍,检查未定义的常量稍微慢一些。不要使用全局变量。
代码:
$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)
主要区别:
不确定效率,但它不仅仅是创建一个var: