PHP包括类内的文件

时间:2012-12-31 03:22:08

标签: php

只是一个简单的问题,但我一直在研究一个小型的MVC框架并发现了一些东西。

例如:

- PHP文件 -

class loadFiles{
        function __construct($file = NULL){
        include $file . '.php';
        }
}
$loadfiles = new $loadFiles('crucialsettings');
echo $randomstring; //Throws an error

- crucialsettings.php -

<?php
    $randomstring = 'hello';
?>

我只是意识到对象范围内包含的文件无法从全局范围中访问。将文件包含在对象中以便可以全局访问的最佳方法是什么?

我希望能够:

$loadfiles->settings();
$loadfiles->classes();
$loadfiles->passwords();

我想构建一个处理全局文件包含的类。

2 个答案:

答案 0 :(得分:2)

在PHP中包含或要求代码的位置无关紧要。解释器在它的第一个定义传递中是非常线性的,也就是说它基本上将所有包含/所需文件按照读取方式的确切顺序压缩到一个大文件中。

有一点需要注意的是,范围确实会发生变化。但一切都适用于“全球”范围。您始终可以使用“global”关键字将全局范围内的内容导入当前范围,以在使用变量之前声明变量。因此,当您想要使用其他脚本中的“全局”变量时,只需要它。

一个小例子......

<强> a.php只会

include('b.php');
global $myVar;
echo $myVar;

<强> b.php

include('c.php');

<强> c.php

$myVar = 'Hello World';

解释器在第一次通过后看到的代码是什么

// In global scope
$myVar = 'Hello World'

// In a.php scope
global $myVar;
echo $myVar;

简而言之,只需添加行

即可从php文件中删除
global $randomstring;

包含criticalsettings.php文件后,您的回声将起作用。

答案 1 :(得分:1)

看来你的框架在内部过于依赖非OOP。不是一种优选的构建方式,但是可以通过遍历变量列表并使它们成为类/实例范围的一部分来执行您想要的操作。这里一个非常有用的功能是get_defined_vars();

假设你有文件a.php,b.php和c.php。每个看起来像这样:

a.php <?php $a = "AAAAAA";

b.php <?php $b = "BBBBBBBBBB";

c.php <?php $c = "CCCCCCCCCCCCCCCCCCCCCCCCCCC";

class mystuff {
    function include_with_vars( $____file ) {

        // grab snapshot of variables, exclude knowns
        $____before = get_defined_vars();
        unset( $____before['____file'] );

        // include file which presumably will add vars
        include( $____file );

        // grab snapshot of variables, exclude knowns again
        $____after = get_defined_vars();
        unset( $____after['____file'] );
        unset( $____after['____before'] );

        // generate a list of variables that appear to be new
        $____diff = array_diff( $____after, $____before );

        // put all local vars in instance scope
        foreach( $____diff as $variable_name => $variable_value ) {
            $this->$variable_name = $variable_value;
        }
    }

    function __construct($file = NULL){
        $this->include_with_vars( "a.php" );
        $this->include_with_vars( "b.php" );
        $this->include_with_vars( "c.php" );
    }
}

$t = new mystuff();
echo "<PRE>"; 
print_r( $t );

此程序现在将从include()指令中获取局部变量,并将它们放在类范围中:

mystuff Object
(
    [a] => AAAAAA
    [b] => BBBBBBBBBB
    [c] => CCCCCCCCCCCCCCCCCCCCCCCCCCC
)

换句话说,文件a.php($a)中的局部变量现在为$t->a