0

我有一个 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");
?>
4

3 回答 3

7

如果你有$你的字符串使用单引号:

display('$vhkvdov#jqlydk#p*_L#1qrlws|ufqh#KWLZ#1hwdgsX');

否则 PHP 会尝试将其$vhkvdov用作变量名并用它的内容替换它,因为我期望没有设置变量,所以什么都不是

字符串上的 PHP 参考


注意:在开发过程中,我会error_reporting在 php.ini 中设置为

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 in

于 2013-04-13T16:51:38.447 回答
3

问题是您使用双引号,这使 PHP 解释 PHP 变量的内部字符串。

考虑以下示例:

$friend = "foo";
echo "hello $friend";
// Output: hello foo

如果您不希望 PHP 解释字符串内容,请改用单引号。

$friend = "foo";
echo 'hello $friend';
// Output: hello $friend
于 2013-04-13T16:53:46.263 回答
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';
于 2013-04-13T16:53:34.373 回答