题
C++预处理器 #define
是完全不同。
是的PHP define()
任何不同于只是创造一个var?
define("SETTING", 0);
$something = SETTING;
vs
$setting = 0;
$something = $setting;
解决方案
'定义'操作本身是相当缓慢的确通过xdebug分析器。
这里是基准 http://t3.dotgnu.info/blog/php/my-first-php-extension.html:
纯'定义'
380.785获取/秒
14.2647意味着毫秒/第一反应常量的定义与'hidef'延伸
930.783获取/秒
6.30279意味着毫秒/第一反应
断开链接更新
博文引用上述已经离开了互联网。它仍然可以被看 在这里,通过机韦巴克.这里是另一个 类似的文章.
该图书馆提交人引用可以找到 在这里(apc_define_constants) 和 在这里(hidef扩).
其他提示
一般来说,常量的想法是在程序中常量,(听起来很有趣,对吧?;))。这意味着编译器(解释器)将替换“FOOBAR”。在整个剧本中使用FOOBAR的价值。
理论和优势太多了 - 如果你编译的话。现在PHP非常动态,在大多数情况下你不会注意到不同,因为PHP脚本是在每次运行时编译的。除非你使用像这样的字节码缓存,否则你不应该看到常量和变量之间的速度存在显着差异。 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
这是可重复的,具有类似的结果。在我看来,常量定义和/或使用比变量慢一点。
这里有差异,从 手册
- 常量没有一美元sign($)之前,他们;
- 常量可能仅仅被定义使用的定义()功能,不能通过简单的分配;
- 常量的可能定义和在任何地方进行访问,而不考虑变量范围的规则;
- 常量可能不能重新界定或不确定,一旦他们已经设置;和
- 常量只能评价标值。
对我来说,主要的好处是全球范围。我当然不用担心他们的效率使用他们,只要你需要一个全球标的价值,这应该不可改变的.
看来效率不高。 (我在这里根据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 Version 5.2.6,Apache 2.0,Windows XP
每个语句执行1000次,而开销时间为12ms 1000个电话不会让最终用户撕掉他们的头发, 与if(true)比较时,它确实会产生一些有趣的结果:
1)if($ true)几乎相同2)if(TRUE_CONST)差不多 慢两倍 - 我猜这个替换不是在编译时完成的 时间(我不得不仔细检查这一个!)3)定义()慢3倍 如果常量存在4)define()是19 TIMES SLOWER如果 常数不存在! 5)isset()无论如何都非常有效 你扔的是什么(对于任何实现数组的人来说都是好消息 驱动事件系统 - 我!)
可能要避免if(已定义('DEBUG'))...
来自tris + php at tfconsulting dot com dot au 26-Mar-2009 06:40
定义是简单的静态意义,意味着它的值在运行时不能改变,而变量是动态意义的,因为你可以在整个过程中自由地操纵它的值。
主要的差异:
- 定义是恒定变量是变量
- 他们不同的范围和可见性
当我运行速度测试时,设置和转储的常量比设置变量并将其转储出来要快得多。
不确定效率,但很多创建一个var:
- 这是一个恒定:你不能确定或重新分配这一设置。
- 如果该定义没有找到,$的东西被设定为"设定",这是有用的,例如,在i18n:如果一个翻译缺失(即。相应的定义是本地化的文件),我们看到一个大词以大写形式,很可见...