0

我在我的个人页面中使用此代码来创建一个唯一的标题和活动选项卡。

<?php 
    $title = "Blanktree Design"; 
    $home = "class=\"active\"";
    include "header.php"; 
?>

我在 header.php 中使用此代码来执行这些差异。

<title><?php echo $title; ?></title>

<ul id="nav">
   <li <?php echo $home ?>><span>begin</span><a href="/">home</a></li>
   <li <?php echo $about ?>><span>curious?</span><a href="/about">about</a></li>
   <li <?php echo $contact ?>><span>locate</span><a href="/contact">contact</a></li>
</ul>

我最好奇的是,因为我是 PHP 新手,所以只是回显一个不存在的变量是否有效?我的意思是......它有效并且不会出错。但我只是想知道这是否是糟糕的编程。

提前致谢。

解决

在一天结束时,所有讨论都已完成,这是我发现在我的特定场景中最有意义的内容:

<?php 
    $title = "Blanktree Design"; 
    $home = "class=\"active\"";
    $about = $contact = "";
    include "header.php";
?>

并像以前一样调用变量:

<ul id="nav">
   <li <?php echo $home ?>><span>begin</span><a href="/">home</a></li>
   <li <?php echo $about ?>><span>curious?</span><a href="/about">about</a></li>
   <li <?php echo $contact ?>><span>locate</span><a href="/contact">contact</a></li>
</ul>
4

3 回答 3

4

是的,回显(和任何其他用法)不存在的变量总是很糟糕的编程。
它实际上是错误的 - 由于错误的 PHP 设置,您只是看不到它。

error_reporting(E_ALL);

在脚本的顶部将显示这些错误。

尽管 PHP 几乎不允许使用未定义的变量,但一个好的编程习惯是在代码中使用之前定义每个变量
它将让您避免许多错误和意外行为,甚至是严重的漏洞。

然而,大多数人认为这个问题是错误的,认为在使用之前应该检查变量是否存在。但是稍微考虑一下这个话题,你会发现它很荒谬——似乎这种检查的唯一目的是堵住一条错误消息。那么,语言开发人员发明这样的警告只是为了给程序员不必要的验证带来麻烦?

当然不是。
此警告(与任何其他警告一样)的真正目的是让程序员知道出现了问题。
这真的很简单:PHP 只是告诉你“不要忘记给这个变量赋值吗,兄弟?看来你会使用它,所以,你期望它有一些价值,但没有。只是让你们知道。” 但是通过使用 isset() 我们只是堵住了这个警告,仅此而已。对自己不利。

此外,通过初始化变量,可以确定变量的存在及其值。

一个小例子:

<?
while ($i < 10) {
  echo $i." ";
}
echo "<br>";
while ($i < 10) {
  echo $i." ";
}
?>

多少行会打印出这个片段?只有一个。

因此,每一个脚本变量都应该在使用前进行初始化。

一个特殊的问题是外部变量
程序员无法控制它的行为。有时存在外部变量是应用程序逻辑的一种情况。例如:

if (isset($_GET['id'])) {
  //displays particular article
} else {
  //displays list of articles
}

允许以这种方式检查。
但是应该严格限制原始外部变量的使用。
例如,如果您要使用先前输入的值填充表单字段,建议创建另一个变量,例如 $FORM,并使用从原始外部变量正确准备的值初始化它的项目。

于 2011-03-04T01:44:44.540 回答
4

更好的编程实践是检查它是否首先设置。如

if (isset($variable))
  echo $variable;
于 2011-03-04T01:32:36.027 回答
2

It will throw a warning, see PHP: printing undefined variables without warning, but whether or not you see it depends on your level of error reporting.

于 2011-03-04T01:31:19.540 回答