我有一个PHP函数,在回显一个字符串时,正在丢失一些传递给它的字符。有什么理由会发生这种情况吗?
我通过:$vhkvdov#jqlydk#p*_L#1qrlws|ufqh#KWLZ#1hwdgsX
返回:#jqlydk#p*_L#1qrlws|ufqh#KWLZ#1hwdgsX
这是我的PHP代码:
<?php
function display($str) {
echo $str;
}
display("$vhkvdov#jqlydk#p*_L#1qrlws|ufqh#KWLZ#1hwdgsX");
?>
答案 0 :(得分:7)
如果您在字符串中有$
,请使用单引号:
display('$vhkvdov#jqlydk#p*_L#1qrlws|ufqh#KWLZ#1hwdgsX');
否则PHP会尝试使用$vhkvdov
作为变量名称并将其替换为其内容,因为我预期变量未设置,这将是什么
注意:在开发过程中,我会将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
答案 1 :(得分:3)
问题在于您使用双引号,这使PHP解释PHP变量的内部字符串。
考虑以下示例:
$friend = "foo";
echo "hello $friend";
// Output: hello foo
如果您不希望PHP解释字符串内容,请使用单引号。
$friend = "foo";
echo 'hello $friend';
// Output: hello $friend
答案 2 :(得分:1)
阅读本文以帮助澄清为什么会发生这种情况:
http://php.net/manual/en/language.types.string.php
具体做法是:
当用双引号或heredoc,变量指定字符串时 在其中解析。
这是您的代码发生的事情:
如果遇到美元符号($),解析器将贪婪地视为 尽可能多的标记来形成有效的变量名称。附上 花括号中的变量名称,以显式指定结束 名。
以下是一个例子:
<?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';