【问题标题】:php extract() usage and purposephp extract() 用法和目的
【发布时间】:2017-08-15 14:26:24
【问题描述】:

我(认为)我理解 php 的 extract() 函数的作用。但是,我在阅读一些代码时看到了这样的内容:

extract(['a' => '', 'b' => '', 'c' => 1, 'd' => 0]);

我的问题:

1:这在功能上是否不同于:

$a = ''; $b = ''; $c = 1; $d = 0;

2:使用extract()进行变量声明/赋值的原因是什么?

【问题讨论】:

  • 我不建议使用它,因为您并不总是可以控制来自数组的内容(如果它是动态生成或加载的)。最好只使用数组索引(imo)。但最后,从数组中提取变量与声明它们几乎相同,但我看不出你为什么要以这种方式声明它们(如果这是唯一目的的话)。
  • @WillParky93,来自手册:'不要对不受信任的数据使用提取'。
  • 重申上述内容 - 不要在用户提供的数据上使用extract。你基本上只是在重新实现 register_globals,它在 15 多年前被默认禁用,因为这是一个糟糕的主意。
  • @Progrock 开始大量出汗我想我接下来要忙碌一周。

标签: php


【解决方案1】:

这在功能上是否不同于...

没有两行代码是等价的。 extract 返回值,其中键设置为变量名,值是该变量所等于的值,每行代码都描述了这一点,使它们在功能上等效。

使用 extract() 进行变量声明/赋值的原因是什么?

一个合理的用例是在一个函数上使用extract,该函数返回一个具有已知键的值数组。这样做可以节省您为每个存储值编写一行声明的时间。我之所以说已知密钥,是因为虽然可以通过使用 array_keysvariable variables 来使用未知密钥,但这样做你开始进入一个有问题的编码技术领域。

extract 的文档中指出,“不要对不受信任的数据使用 extract()...”,其中包括可能被恶意更改的用户输入数据。虽然这意味着在 $_POST 上使用extract 对于公共版本来说是不合适的,但在测试或个人项目中这样做在功能上没有任何问题,您可以保证 $_POST 的值符合预期。

请记住,使用 extract 时存在一定程度的歧义,如果您的程序需要在以后维护,请了解 extract 语句返回的内容或查找来自提取可能很困难。 extract 在程序中有它的用途,但它应该伴随着 cmets 概述它正在做什么,以使将来的参考更加清晰。

【讨论】:

    【解决方案2】:

    目的。 1.它可以用作list()的一个版本。但是在 extract() 的情况下,您不需要关心变量的顺序。 此外,从数组中提取的变量属于特定范围。 在使用 db 的情况下,您可以确定 var 存在

    function foo($db){
        $hdl =  $db->prepare("SELECT * FROM test.first");
        $hdl->execute();
        $resultArray = $hdl->fetch(PDO::FETCH_ASSOC);
        extract($resultArray,EXTR_PREFIX_SAME, "wddx");
        echo $id . "<br>";
        echo $name . "<br>";
        echo $email . "<br>";
    }
    

    2.在使用MVC时将变量传递给视图

    //View.php
    class View {
        function render($filename = null) {
            if ($filename !== null) {
                $this->filename = $filename;
            }
            unset($filename);
            extract($this->variables);
            ob_start();
            $this->returned = include($this->dir . $this->filename);
            return ob_get_clean();
        }
    }
    
    //test.php
    $view = new View;
    $view->filename = 'test.phtml';
    $view->dir = './';
    $view->variables = array('test' => 'tset');
    echo $view->render('test.phtml');
    var_dump($view->returned);
    
    //test.phtml
    <?php echo $test; ?>
    

    【讨论】:

    • 使用 extract 有助于方便查看视图,&lt;?= $foo ?&gt;&lt;?= $this-&gt;foo ?&gt;&lt;?= $array['foo'] ?&gt; 更整洁。我唯一担心的是,如果你在没有引用的情况下提取,你最终可能会复制/加倍数据。
    • 请阅读 extract() 的文档。有一些标志和模式来处理加倍和覆盖
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多