我当前的Web应用程序使用大约30个左右的Contants(DEFINE())。我正在读变量更快的东西。如果存在一个避免变量覆盖的命名约定,那么我看到的唯一其他缺点就是这些变量必须被定义为全局变量,而不是每个函数中的变量。
哪个更快?我在整个应用程序中经常使用这些常量,并且可能会永远在列表中添加更多常量,并且它们可以在函数和类中使用。
答案 0 :(得分:23)
使用define()
定义的常量在PHP中相当慢。人们实际上编写了扩展名(如hidef)来提高性能。
但除非你有很多常数,否则这应该没什么区别。
从PHP 5.3起,您还可以使用const NAME = VALUE;
使用编译时常量。那些更快。
答案 1 :(得分:11)
差别很小(微优化)。您最好在类中封装一些常量,以便Classname::CONSTANT
访问它们,以免污染应用程序的全局命名空间。
答案 2 :(得分:8)
快速测试表明,定义常量(define('FOO', 'bar');
)比定义变量($foo = 'bar';
)慢大约16到18倍,但使用定义的(常量)值约为4到6倍更快。
答案 3 :(得分:0)
这些基准测试的结果仍然存在;变量比define()
和const
都快:
http://planetozh.com/blog/2006/06/php-variables-vs-constants
http://www.joomlaperformance.com/articles/performance/52_php_programming_tips_43_13_2.html
答案 4 :(得分:0)
我对constants
和variables
进行了基准测试,发现与variables
相比,使用constants
的性能有了显着提高。我知道这很明显,但是绝对值得在可能的情况下使用局部变量而不是常量。
如果constants
内使用了loops
次,那么绝对值得将常量声明为类/局部变量,而应使用它。
基准测试用例包括创建两个函数。每个循环都有一个执行10000000
次的循环。一种访问常量文件中声明的常量,另一种访问局部变量。
TestConstants.php
class TestConstants
{
const TEST_CONSTANT = 'This is a constant value';
}
Test.php
use TestConstants;
class Test {
protected $TEST_CONSTANT;
protected $limit = 10000000;
function __construct() {
$this->TEST_CONSTANT = 'This is a constant value';
}
function testA() {
$limit = $this->limit;
$time_start = microtime(true);
for ($i = 0; $i < $limit; ++$i) {
TestConstants::TEST_CONSTANT;
}
$time_end = microtime(true);
$execution_time = ($time_end - $time_start);
echo ''. $execution_time .' seconds <br/>';
}
function testB() {
$limit = $this->limit;
$time_start = microtime(true);
for ($i = 0; $i < $limit; ++$i) {
$this->TEST_CONSTANT;
}
$time_end = microtime(true);
$execution_time = ($time_end - $time_start);
echo ''. $execution_time .' seconds <br/>';
}
}
$test = new Test();
$test->testA();
$test->testB();
结果如下
testA()在0.55921387672424秒内执行
和
testB()在0.33076691627502秒内执行
PHP版本
5.6.30
我认为与某人共享此内容可能会有所好处,只要在适用的情况下将它们声明为constants
,就可以避免直接调用variables
(尤其是在循环内)。
谢谢。
答案 5 :(得分:-1)
我也无法想象任何速度差异都是重要的。当然,在许多情况下,变量比常量更容易使用。
然而,似乎你真正的问题是你有一堆配置数据,你想避免必须将大量的变量传递给函数,或者必须使它们全局化。
没有一个答案适用于所有人,但一个流行的解决方案是使用注册表类或自己创建一个。通过声明一个php数组,你可以很容易地做到这一点。然后初始化注册表对象,您的函数和类通过静态方法调用访问它。我只会将您推荐给zend_config和zend_registry作为示例,而不是为您提供摘要。虽然ZF提供了这些,但您不应该害怕推出自己的版本,因为如果您想避免在项目中使用ZF,则不能以更简单的形式重新创建。