代码之家  ›  专栏  ›  技术社区  ›  Aaron Yodaiken

将变量导出到PHP中的上一个作用域

  •  2
  • Aaron Yodaiken  · 技术社区  · 15 年前

    也就是说,我想要这个代码:

    function a() {
        $a = "a";
        $b = "b";
        $c = "c";
    }
    function b() {
        a();
        echo $a . $b . $c;
    }
    b(); // Output: abc
    echo $a; // Should raise a notice that $a is undefined
    

    能够像你说的那样工作。我知道这在大多数语言中是不可能的,但我能用Ruby做到这一点;不知道你能不能用PHP来实现。

    另外,如果 a 一定是这样的 a('b') 或者别的什么。


    实际上,代码是这样的:

    static function renderError($what, $vararray) {
        foreach($vararray as $key => $val) { /* this foreach is the code we want to decouple */
            $key = 'e_'.$key;
            $$key = htmlspecialchars($val);
        }
        ob_clean();
        exit(eval('?>'.file_get_contents(ROOT."/templates/$what.php")));
    }
    

    E_Render::renderError('NotFound', array( 'requested_url' => '/notfound', 'misspelling' => '/reallynotfound' ));

    然后,在模板中/NotFound.php,你会有这样的感觉:

    <html>
    <body>
    <?php echo $e_requested_url; ?> could not be found. Did you mean <?php echo $e_misspelling: ?>?
    </body>
    </html>
    

    我们真的不希望我们的模板作者做更多的事情…虽然 $e['requested_url']

    5 回复  |  直到 15 年前
        1
  •  8
  •   NullUserException Mark Roddy    15 年前

    这就是为什么我们有OO:

    class Foo {
    
        function a() {
            $this->a = "a";
            $this->b = "b";
            $this->c = "c";
        }
    
        function b() {
            $this->a();
            echo $this->a . $this->b . $this->c;
        }
    }
    
    $f = new Foo;
    $f->b(); // Output: abc
    echo $a; // Should raise a notice that $a is undefined
    

    或者:

    function a() {
        $a = "a";
        $b = "b";
        $c = "c";
    
        return compact('a', 'b', 'c');
    }
    
    function b() {
        extract(a());
        echo $a . $b . $c;
    }
    

    请参见: compact() extract()

    否则,我看不到一种不彻底改变语言的方法。

        2
  •  1
  •   Matthew    15 年前

    不管怎样,最接近的是通过引用传递:

    <?php
    function a(&$a, &$b, &$c)
    {
      $a = 1;
      $b = 2;
      $c = 3;
    }
    
    function b()
    {
      a($a, $b, $c);
    }
    ?>
    
        3
  •  1
  •   Yanick Rochon    15 年前

    我刚运行了这个代码

    var1.php文件

    <?php
    
    function a($vars) {
       foreach ($vars as $var => $val) {
          $$var = $val;
       }
    
       echo eval('?>' . file_get_contents('var2.php') . '<?php ');
    };
    
    
    a(array('a' => 'foo', 'b' => 'bar', 'c' => 'baz'));
    

    --

    <html>
       <body>
          <div><?= '$a = "' . $a . '"' ?></div>
          <div><?= '$b = "' . $b . '"' ?></div>
          <div><?= '$c = "' . $c . '"' ?></div>
       </body>
    </html>
    

    并输出:

    $a = "foo"
    $b = "bar"
    $c = "baz"
    

    原因是因为 eval() 保持当前范围,函数中本地声明的任何变量也将在求值字符串中本地可用。同样的道理。

    ** 更新 **

    邪恶的

    --

    <?php
    
    function showError($error, $vars) {
    
       $template = file_get_contents("{$error}.php");
       $keys = array();
       $values = array();
       foreach ($vars as $var => $val) {
          $keys[] = '@{e_'.$var.'}';
          $values[] = $val;
       }
    
       echo str_replace($keys, $values, $template);
    };
    
    showError('template1', array('value' => 300, 'message' => 'Something foo'));
    

    --

    <html>
       <body>
          <div>Error <span style="font-weight: bold; color: red;">@{e_value}</span></div>
          <div>The message was : <em>@{e_message}</em></div>
       </body>
    </html>
    
        4
  •  0
  •   CrayonViolent    15 年前

    为什么你不能从a()退回$a?

    function a() {
        $a = "a";
        return $a;
    }
    function b() {
        $a = a();
        echo $a;
    }
    b(); // Output: a
    echo $a; // Should raise a notice that $a is undefined
    

    这不会破坏范围。

        5
  •  0
  •   mhitza Federico Taschin    15 年前

    function a() {
      $a = "a";
      $b = "b";
      $c = "c";
    
      return array($a, $b, $c);
    }
    
    function b() {
      list($a, $b, $c) = a();
      echo $a . $b . $c;
    }
    
    推荐文章