2014-07-21 188 views
0

我想用PHP做懒惰变量评估。受影响的示例代码:PHP懒惰评估

<?php 

function title($page) 
{ 
    return $page . ' - $_GET["title"]'; 
} 

?> 


<title><?= title($_SERVER['SCRIPT_NAME']) ?></title> 

$_GET['title']未被评估。我怎样才能做到这一点?

回答

8

根据the documentation,不会评估单引号内的变量引用。使用双引号或简单的串联:

function title($page) 
{ 
    return $page . ' - ' . $_GET["title"]; 
} 

而在HTML中使用时,使用htmlspecialchars()你应该总是正确转义变量。

<title><?= htmlspecialchars(title($_SERVER['SCRIPT_NAME'])); ?></title> 
+0

谢谢。我完全意识到双重插入规则和单一插入规则。我只是试图让'$ _GET'变种被评估为“懒惰”。 –

+2

什么是“懒”评估*? –

+0

@MichaelIrwin,如果你“充分意识到”单引号是如何工作的,那听起来像你选择有意使用它们。如果不是在访问'$ _GET'之前等待函数被调用,那么“懒惰评估”的含义并不清楚,而且也不清楚为什么您认为单引号可以提供帮助。 – Wyzard

1

这里是你可以做一些懒惰的评价的一种方法:

<?php 

$_GET["title"] = ""; // faking a GET with a missing title 

function title($page) 
{ 
    $title = htmlentities($_GET["title"]); 
    return $page . ' - ' . ($title = $title?: 'missing title'); 
} 

echo title(htmlentities($_SERVER['SCRIPT_NAME'])); 
?> 

如果有任何一个标题,它将显示的,但如果它丢失,那么用户得到通知。我使用'?:'运算符,它确保$ title被赋予右边操作数的值,如果$ title保留一个假值。请注意,一般而言,PHP不会在与布尔运算符合逻辑以及按位运算符的工作之外使用懒惰评估。虽然在试图实例化一个缺少构造函数的类时会传递一个参数,在这种情况下,当一个操作码生成与该参数有关时,它从不执行,所以表达式也不会执行。