2012-01-03 22 views
2

我只注意到我可以使用一个变量作为参数,如下所示:$variable = "This's a string."; function('$variable'),而不是像这样:function('This's a string');。我可以明白为什么我不能做后者,但我不明白在第一个例子工作的幕后发生了什么。PHP如何自然地预测变量中的撇号?

+3

如何'函数(“$变量”)'为你工作? '$ variable'永远不会被您之前设置的字符串替换。相反,字符串“$变量”将被赋予你的函数。 – sascha 2012-01-03 09:18:39

+0

@ Sn0opy谢谢。伍德斯托克说,你好...在Birdanese手语。 – 2012-01-05 01:40:30

回答

5

你听说过formal languages的方式吗?解析器跟踪上下文,因此它知道期望的字符是什么,什么不是。

在你关闭已经打开的字符串的那一刻,你将返回到打开字符串之前的上下文(即在这种情况下,在函数调用的上下文中)。

码的相关的PHP-内部件是:

  • the scanner接通序列之间“和”成一个不可分割的令牌。
  • the parser将单个不可分割的标记放入语义环境中。

这些是相关卡盘C code,使它的工作。它们是PHP内部工作的一部分(特别是Zend Engine)。

PHP并没有预料到任何东西,它真的会读取所有char字符,并且只要它在不允许的语义环境中找到意外的TOKEN,就会发出解析错误。

在您的情况下,它会读取令牌'This'并且扫描程序会匹配一个新字符串。然后它继续阅读s,当它找到一个空格时,它将s变成constant。作为常数和先前发现的令牌'This'一起不形成任何known reduction(可能削减解析器链接我给你上面描述),解析器会发出像

意外T_STRING

错误

你可以从该消息推断,它是真正指的是什么已经发现(或者它希望它找到的),所以没什么没有什么期待

你的问题本身是错误的,因为变量中没有引用(变量的标识符)。您可能在变量的值中有一个引用者。不要混淆他们。值可以是独立的,没有一个变量:

<?php 
'That\'s fine'; 
42; 

(这是刚刚加载这些值到内存中一个有效的PHP代码)

0

使用这样

function('This\'s a string');

+1

我想,这不是他想读的。他甚至在推理上有错误。看到我的评论。 – sascha 2012-01-03 09:21:10

+1

他当然知道这是对的。他对推理很感兴趣,如果你仔细阅读他的问题;) – Flavius 2012-01-03 09:45:11

+0

@maxjackie是的,我注意到,这当然有效。但是,当你有一个4000行的字符串时,你可以做一个批量的替换,或者你可以使用双引号,对吗?无论如何,我只是想知道为什么当我使用单引号和$变量时没有出现错误。呵呵 – 2012-01-05 01:41:51

1

功能( '$变量')不应该在" "逃逸单引号内正确

字符工作中''

字符不逃脱单引号(他们不能逃脱自己!)。

使用"",您还可以使用变量作为字符串的一部分,所以:

$pet = 'cat' 
$myStory = "the $pet walked down the street" 

function($pet)是函数应该传递一个字符串