PHP使用extract()将数组值作为变量传递并在页面上显示

3

我正在尝试创建一个view($path,$data)函数,该函数涉及到PHP技术,主要功能是从目录中包含特定文件并将数据/变量传递到该页面。我已经成功创建了$path并且能够包含定义的路径,现在我的下一步是将$data值传递到我包含的页面,并希望将每个数组标签转换为一个变量。

我的php类如下classes.php

define("SITE_NAME", "process");

 class helpers {


        public function view($path, $data) 
        {

            $dir = $_SERVER['DOCUMENT_ROOT'].SITE_NAME."/";

            include($dir.$path.".php");

            return extract($data);



        }  

}

在我的index.php文件中。
require_once('classes.php');

$helper = new Helpers();

$data['title'] = "My Test";
$data['test'] = "test1";

$helper->view('test',$data);

现在在我的 test.php 文件中,我试图输出$title的值,我认为它应该返回My Test的值,以测试是否从index.php获得了值,我能够使用print_r输出$data。如下所示:Array ( [title] => My Test [test] => test1 )请问有什么建议可以帮助我实现吗?我尝试使用extract()函数,但不知道我的语法是否正确。提前感谢你的帮助!

1
我看不出你的代码有任何问题。如果有错误,我认为它都很好 ;) - elegisandi
是的,$data.title很好,但我需要将标题转换为一个新变量,即$title。 - KaoriYui
谢谢您的回复,有没有办法将$data['title']转换为$title,这样我就可以echo $title了。我看了一下extract(array,extract_rules,prefix)的语法,我想我可能漏掉了两个参数。 - KaoriYui
在编写程序时,只需简单地返回 $data 并在视图中应用 extract($data); 即可。 - JYoThI
是的,我在@KaoriYui那里发布了我的答案。 - JYoThI
显示剩余2条评论
1个回答

4
因为返回值仅限于一个值。
通过提取,您将获取一个值数组并将其拆分为多个值。
就我个人而言,我避免在我的代码中使用像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); //returns the variables successfully imported from $data
}

.

当您调用return时,可以看到它会结束当前函数的执行并关闭该作用域。您需要重新安排这些内容,以便变量赋值首先发生。

我假设方法中包含的文件是这样的,它没有在原始帖子中提供。

    <h1><?= $title; ?></h1>

你不需要技术上返回任何东西,因为HTML会自然地被输出缓冲区捕获并在脚本执行完毕时显示。但是,这样做不够干净。正确的方法是像这样控制输出缓冲区:

    public function view($path, $data) 
    {
        $dir = $_SERVER['DOCUMENT_ROOT'].SITE_NAME."/";

        extract($data); //variables must exist before importing where they are used.
        ob_start();
        include($dir.$path.".php"); //capture this output
        $view = ob_get_clean();
       return $view;
    }  

   $out = $helper->view('test',$data); //out now contains the HTML output from the included file.

然后你可以用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; ?></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); //variables must exist before importing where they are used.
        include($dir.$path.".php"); //capture this output
    } 
    //outputs when script is done.

这怎么能帮助 OP 实现所需的目标呢? - Cornel Raiu
满意吗?我有足够的PHP经验来回答这样一个简单的问题。说实话,SO应该设置一个10分钟的时间,在此期间答案不能被投票否决,以便进行编辑。有时人们会不小心点击提交按钮。有时候问题并不清楚,试图获取更多信息比评论提供的要复杂得多。 - ArtisticPhoenix
我也认为先解释OP做错了什么,然后再展示如何修复是一个好的方法。仅仅发布答案并不能教会他们任何东西。 - ArtisticPhoenix
PS:在那之前我用了大约两年的Notepad++ :-/。我记得在早期修复PHP4构造函数和修复ereg调用,那真是有趣。还有在IE6中使用simplePie实现圆角边框哈哈。 - ArtisticPhoenix
@cornel.raiu - phpStorm也要100美元(上次我查看时),我可以让老板付款,但Eclipse也很好用,而且我已经习惯了它;另外我也会写一些JAVA。 - ArtisticPhoenix
显示剩余14条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接