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

在PHP的全局命名空间上下文中运行函数块

  •  1
  • Aaron Yodaiken  · 技术社区  · 14 年前

    因此,Senario是我想要一个定制函数来要求库。类似:

    define('E_ROOT', str_replace('//','/',dirname(__FILE__)));
    /* ... */
    function e_load($fn, $allowReloading = FALSE) {
        $inc = E_ROOT.'/path/here/'.$fn.'.php';
        if($allowReloading)
            require $inc; // !!!
        else
            require_once $inc; // !!!
    }
    

    问题是 require require_once 将文件加载到函数的命名空间中,这对函数库、类库和其他库没有帮助。有没有办法做到这一点?

    (一些避免 要求 要求一次 只要不用,就可以了 eval 因为它在很多主机上都是被禁止的。)

    谢谢!

    3 回复  |  直到 11 年前
        1
  •  2
  •   stevendesu    14 年前

    技术上 include() 就好像你要在PHP中插入包含脚本的文本一样。因此:

    includeMe.php:
    <?php
        $test = "Hello, World!";
    ?>
    
    includeIt.php:
    <?php
        include('includeMe.php');
        echo $test;
    ?>
    

    应与以下内容完全相同:

    <?php
        /* INSERTED FROM includeMe.php */
        $test = "Hello, World!";
        /* END INSERTED PORTION */
        echo $test;
    ?>
    

    要实现这一点,创建一个动态包含文件的函数的想法与将动态代码放在一起一样有意义(而且也很容易做到)。这是可能的,但它将涉及很多元变量。

    我会寻找 Variable Variables 在PHP和 get_defined_vars 用于将变量引入全局范围的函数。这可以通过以下方式实现:

    <?php
    define('E_ROOT', str_replace('//','/',dirname(__FILE__)));
    /* ... */
    function e_load($fn, $allowReloading = FALSE) {
    
        $prev_defined_vars = get_defined_vars();
    
        $inc = E_ROOT.'/path/here/'.$fn.'.php';
        if($allowReloading)
            require $inc; // !!!
        else
            require_once $inc; // !!!
    
        $now_defined_vars = get_defined_vars();
    
        $new_vars = array_diff($now_defined_vars, $prev_defined_vars);
    
        for($i = 0; $i < count($new_vars); $i++){
            // Pull new variables into the global scope
            global $$newvars[$i];
        }
    }
    ?>
    

    只是使用可能更方便 require() require_once() 代替 e_load()

    注意函数和常量 应该 总是在全局范围内,因此无论在哪里定义它们,它们都应该可以从代码中的任何地方调用。

    <?php
    function test(){
        function test2(){
            echo "Test2 was called!";
        }
    }
    
    //test2(); <-- failed
    test();
    test2(); // <-- succeeded this time
    ?>
    

    test()

        2
  •  0
  •   Your Common Sense    14 年前
    require_once E_ROOT.$libName.'.php';
    

        3
  •  0
  •   Tel    11 年前

    $test = "Hello, World!";
    

    $GLOBALS[ 'test' ] = "Hello, World!";