2010-03-09 70 views
2

This question让我想起了裸露的琴弦。在PHP中是否有任何合法用途?

当PHP看到一个没有用引号括起来的字符串时,它首先检查它是否是一个常量。如果不是,它只是假定它是一个字符串,并继续。因此,举例来说,如果我有

echo $foo[bar]; 

如果有一个叫巴恒它使用的数组键,但如果没有,那么它把酒吧作为裸字符串,所以它的行为就像

echo $foo["bar"]; 

如果在将来的某个日期添加一个具有相同名称的常量,这可能会导致各种问题。

我的问题是,是否有任何情况下,它使用裸字符串实际上是有意义的?

回答

12

不,我看不到一个有意义的单一实例,它总是很危险。应该使用不带引号的字符串来保留常量。我不明白PHP的发明者如何决定引入这种荒谬的行为 - 它使常量的正确使用几乎不可能(因为如果你尝试访问一个尚未定义的常量,PHP会默默地,愚蠢地产生一个字符串),而不会给任何好处。

+2

+1 ,我同意你Pekka的观点,并且仅仅因为PHP足够宽容,可以将裸露的字符串转换为文字,并不意味着你应该养成使用它的习惯。 – 2010-03-09 01:17:19

+0

@Anthony true,加上(我编辑了我的答案)大量地破坏了常量的使用 - 你永远不能真正依赖它们的设置,并且必须使用'defined'来检查它们。如果一个常量没有被定义,正确的方法是抛出一个致命的错误。 – 2010-03-09 01:19:58

+0

那么,你只需报告警告级错误并警惕地修复它们。但它仍然是一个PITA。 – 2013-09-04 20:23:20

0

您将唯一一次使用裸露字符串作为关键是如果它以前在define()中用于常量。

1

这并不可能算作是合法的,但我的朋友的tweetable证明了概念的MVC框架,TweetMVC避开在几个景点的报价挤进去,如几个大字:

foreach(c('mod')as$f)require"t/$f.php";@list($c,$m,$a)=explode('/',@$_GET[r],3);$c=$c?:c('dc');$o=(@include"c/$c.php")[email protected]$c($m,$a):e(1) 
相关问题