因为返回值仅限于一个值。
通过提取,您将获取一个值
数组
并将其拆分为多个值。
就我个人而言,我避免在我的代码中使用像
extract
和
$$var
这样的东西,因为它会破坏我的IDE并使可读性几乎不可能。 话虽如此,在这种情况下,使用它是有意义的,因为它在有限的范围内,这限制了无意中意外覆盖另一个变量的可能性。
http://php.net/manual/en/functions.returning-values.php
一个函数不能返回多个值,但可以通过返回一个数组来获得类似的结果。
并且
http://php.net/manual/en/function.extract.php
extract — 从数组中将变量导入到当前符号表
符号表 ~ 作用域
进一步
返回值: 返回成功导入到符号表的变量数量
public function view($path, $data)
{
$dir = $_SERVER['DOCUMENT_ROOT'].SITE_NAME."/";
include($dir.$path.".php");
return extract($data);
}
.
当您调用return时,可以看到它会结束当前函数的执行并关闭该作用域。您需要重新安排这些内容,以便变量赋值首先发生。
我假设方法中包含的文件是这样的,它没有在原始帖子中提供。
<h1><?= $title; ?></h1>
你不需要技术上返回任何东西,因为HTML会自然地被输出缓冲区捕获并在脚本执行完毕时显示。但是,这样做不够干净。正确的方法是像这样控制输出缓冲区:
public function view($path, $data)
{
$dir = $_SERVER['DOCUMENT_ROOT'].SITE_NAME."/";
extract($data);
ob_start();
include($dir.$path.".php");
$view = ob_get_clean();
return $view;
}
$out = $helper->view('test',$data);
然后你可以用echo
输出它。我认为这样更好,因为你可以将HTML输出插入到另一个数据数组中并将其导入到另一个模板中。这对于可重复使用的标题、页脚或导航栏等非常有用。
考虑一下这个例子。
$head['page_title'] = "My Test";
$body['head'] = $helper->view('header',$head); //create head and assign to body
$body['name'] = 'John Smith';
echo $helper->view('body',$body); //create body (with head inserted) and echo
和 header.php
<title><?= $page_title
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
和 body.php
<!DOCTYPE html>
<html>
<head>
<?= $head; ?>
</head>
<body>
<p><?= $name; ?></p>
</body>
</html>
现在的输出将会是这样
<!DOCTYPE html>
<html>
<head>
<title>My Test</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
<p>John Smith</p>
</body>
</html>
现在两个页面合并成一个,即输出。您可以将其带到任何可重用级别,但它将为您节省大量输入并使维护视图变得更加容易。但是,正如我所说的,您也可以简单地允许其自然输出。
public function view($path, $data)
{
$dir = $_SERVER['DOCUMENT_ROOT'].SITE_NAME."/";
extract($data);
include($dir.$path.".php");
}
$data['title']
转换为$title
,这样我就可以echo $title
了。我看了一下extract(array,extract_rules,prefix)
的语法,我想我可能漏掉了两个参数。 - KaoriYui$data
并在视图中应用extract($data);
即可。 - JYoThI