heredoc格式及其实现

时间:2011-10-27 16:48:38

标签: php heredoc

我写了以下代码......

<?php

$conn=mysql_connect("localhost","","");
if($conn)
echo "connection established";

mysql_select_db("moviesite");

$que="select * from movie";
$result=mysql_query($que,$conn);
?>

<html>
<title>movie database</title>
<body>
<table border=1 align=center>
<th colspan=2>
PEOPLE<a href='movie.php?action=add & id='>[ADD]</a>
</th>

<?php
$ta_row=<<<eod
    <tr>
    <td>
    $mov_name
    </td>
    <td>
    <a href='movie.php?action=edit & id=$mov_id'>[EDIT]</a>
    <a href='movie.php?action=delete & id=$mov_id'>[DELETE]</a>
    <td>
    </tr>
eod;

while($row=mysql_fetch_array($result))
{
$mov_id=$row["id"];
$mov_name=$row["name"];
echo $ta_row;
}
?>

现在上面的代码没有打印电影的名称或id(字段是空白的)...所以我在定义$ mov_id和$ mov_name之后在$循环中剪切并粘贴$ ta_row ...解决了所有问题...但我的问题是为什么代码早先失败...因为我在定义$ mov_id和$ mov_name后输出ta_row所以如果$ ta_row只是一个字符串,其内容变量应该已经改变。 ..为什么他们没有改变?

2 个答案:

答案 0 :(得分:3)

因为heredoc就像任何其他字符串一样 - 当你声明它时它的值是固定的。如果在声明$mov_id时未设置变量$mov_name$ta_row,则无法在$ta_row中使用它们。

如果您想要做的事情就像您首先尝试的那样,则必须使用str_replace()sprintf()之类的内容 - 将原始字符串中的占位符替换为实际值你想要展示。

考虑一下:

$myVar = "Some string containing a $var";
$var = 'Variable';
echo $myVar;
// Outputs: Some string containing a 

现在这个:

$var = 'Variable';
$myVar = "Some string containing a $var";
echo $myVar;
// Outputs: Some string containing a Variable

...... Heredocs的行为完全就像双引号字符串一样(从这个角度来看,至少)。

或者你可以这样做:

$myVar = 'Some string containing a $var';
$var = 'Variable';
echo $myVar;
// Outputs: Some string containing a $var
echo str_replace('$var',$var,$myVar);
// Outputs: Some string containing a Variable

...因为$myVar现在是单引号,$var字面上会出现。然后,当您运行str_replace()时,它将替换为$var的值,而不是文字字符串。

值得您重新阅读this

答案 1 :(得分:0)

当你在循环之前使用它时它没有用,因为它试图使用变量$mov_id$mov_name的值,因为它们就在那时存在。由于它们在代码中没有定义,因此没有任何内容可以添加。在那之后,$ta_row只是一个包含字符串的变量,只有一个字符串 - 没有HTML的变量。

如果您想将其移出循环,请使用一些占位符,例如## MOV_ID ##和## MOV_NAME ##,然后您就可以

echo str_replace(array('##MOV_ID##', '##MOV_NAME##', array($mov_id, $mov_name), $ta_row);

获得所需的结果