关于性能:PHP中的const vs static

const vs static in PHP

本问题已经有最佳答案,请猛点这里访问。

在php5中,我可以向类声明常量值:

1
2
3
4
class config
{
     const mailserver = 'mx.google.com';
}

但我也可以声明公共静态:

1
2
3
4
class config
{
     public static $mailserver = 'mx.google.com';
}

在配置文件的情况下,我将稍后介绍,例如:

1
2
imap_connect(config::$mailserver ...
imap_connect(config::mailserver ...

你认为哪个选项更适合使用??(更快、更少的内存负载等)

谢谢。


静态变量可以更改,常量变量不能更改。应该主要考虑配置变量是否能够在运行时进行更改,而不是哪个更快。两者之间的速度差(如果有的话)是如此之小,不值得考虑。


使用函数返回全局

0.0096、0.0053、0.0056、0.0054、0.0072、0.0063、0.006、0.0054、0.0054、0.0055、0.005、0.0057、0.0053、0.0049、0.0064、0.0054、0.0053、0.0053、0.0061、0.0059、0.0076、配置1

使用get-instance-normal类

0.0101,0.0089,0.0105,0.0088,0.0107,0.0083,0.0094,0.0081,0.0106,0.0093,0.0098,0.0092,0.009,0.0087,0.0087,0.0093,0.0095,0.0101,0.0086,0.0088,0.0082,配置2

使用静态VaR

0.0029,0.003,0.003,0.0029,0.0029,0.0029,0.003,0.0031,0.0032,0.0031,0.0029,0.0029,0.0029,0.0029,0.0031,0.0029,0.0029,0.0029,0.0029,0.0029,配置3

使用常数VaR0.0033、0.0031、0.0031、0.0031、0.0031、0.0031、0.0032、0.0031、0.0031、0.0031、0.0031、0.0034、0.0031、0.0031、0.0033、0.0031、0.0037、0.0031、0.0031、0.0032、0.0031、配置4

ZZU1〔0〕


在不允许静态变量的情况下,可以使用常量作为默认函数参数值。


const和static的另一个区别是类常量中不允许使用数组等变量,因此

1
2
3
4
class mytest
{
    public static $c = array(1=> 'hello', 2=>'world');
}

作品,但

1
2
3
4
class mytest
{
    const c = array(1=> 'hello', 2=>'world');
}

不会。


还要注意,由于yacoby上面所说的,对于静态变量,您可以做一些不能用const做的事情,例如,将运行时方法调用的结果赋给变量。


"const"和"public static"都是邪恶的!

正如KeithHum所指出的,常量不能是运行时方法的结果。而且,虽然我最初认为他说的是"可以将运行时方法调用的结果赋给(静态)变量"是正确的,但我的测试表明,要做到这一点,您必须跳过一些圈。

这似乎是一个小问题,但它可能是未来灾难的种子。假设在将来由于一些不可预见的原因,我被迫切换到初始化方法。如果这意味着我必须在我的控制下对文件做一些更改,我没有问题。但是,如果我改变了一个我已经发送给其他开发人员的库呢?

我要写的是,至少,如果他们想升级到我的新版本,我必须告诉其他人(以及"未来的我")对他们的文件进行更改。在"const"的情况下,他们必须在使用它的任何地方添加"$"。在其他场景中,我今天的测试表明,它们可能需要做更少的更改,但也有一些更改。

假设使用面向对象的代码,我将遵循我在许多语言中看到的一般建议,并且需要对PHP进行额外的强调—避免任何类型的可见属性,无论是常量、静态还是其他任何类型的属性。使用"getter"方法!

这看起来像是一个可笑的性能冲击和丑陋的代码风格,但除非你能预测未来,否则这是唯一的出路。

请参见:tjerd visser关于如何初始化静态变量并给它一个bump的答案。忽略他的贬低者-如果你关注的是性能,除了可能的错误和其他灾难,然后切换到另一种语言。