我有一个PHP函数,在回显出一个字符串,正在失去一些字符传递在它。为什么会发生这种事?
I pass: $vhkvdov#jqlydk#p*_L#1qrlws|ufqh#KWLZ#1hwdgsX
返回:#jqlydk#p*_L#1qrlws|ufqh#KWLZ#1hwdgsX
<?php
function display($str) {
echo $str;
}
display("$vhkvdov#jqlydk#p*_L#1qrlws|ufqh#KWLZ#1hwdgsX");
?>
如果您的字符串中有$
,请使用单引号:
display('$vhkvdov#jqlydk#p*_L#1qrlws|ufqh#KWLZ#1hwdgsX');
否则PHP将尝试使用$vhkvdov
作为变量名并将其替换为其内容,什么都没有,因为我期望变量没有设置
PHP对字符串的引用
注意:在开发过程中,我将php.ini中的error_reporting
设置为
error_reporting=E_ALL | E_NOTICE;
和
display_errors=On
或
log_errors=On
error_log=PATH/TO/YOUR/LOG.file ; make sure this is writable by the web server
到,请参阅中的错误信息:
PHP注意:未定义变量:vhkvdov
问题是您使用了双引号,这使得PHP为PHP变量解释内部字符串。
考虑下面的例子:
$friend = "foo";
echo "hello $friend";
// Output: hello foo
如果不希望PHP解释字符串内容,请使用单引号。
$friend = "foo";
echo 'hello $friend';
// Output: hello $friend
读一读这段话,帮助你弄清楚为什么会发生这种情况:
http://php.net/manual/en/language.types.string.php 专:当一个字符串用双引号或带引号指定时,变量
你的代码是这样的:
如果遇到美元符号($),解析器将贪婪地取为尽可能多的标记来组成一个有效的变量名。附上的变量名中的花括号来显式指定名字。
下面是一个例子:
<?php
$juice = "apple";
echo "He drank some $juice juice.".PHP_EOL;
// Invalid. "s" is a valid character for a variable name, but the variable is $juice.
echo "He drank some juice made of $juices.";
?>
上面的示例将输出:
他喝了一些苹果汁。他喝了一些用……做的果汁
当您使用单引号时,您将避免这个问题,因为字符串按字面意思取:
// Outputs: This will not expand: 'n a newline
echo 'This will not expand: 'n a newline';
// Outputs: Variables do not $expand $either
echo 'Variables do not $expand $either';