PHP 类中包含文件

3

很快的一个问题,我正在开发一个小型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();

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

include与从文件中复制并粘贴代码到文本编辑器相同。因此,无论插入什么,都将作为PHP源代码执行。 - Reactgular
如果你想要在全局范围内设置它,可以使用 $GLOBALS['randomstring'] = 'hello'; - N Rohler
这是实际的工作代码吗?如果是,那么您需要学习如何实例化对象。请参阅 new 关键字。 - hafichuk
抱歉,这是我随口编的未经测试的代码。糟糕! - Sam
2个回答

2

无论你在PHP中包含或者引入代码的位置都没有关系。解释器在第一次定义时是顺序执行的,也就是说,它会按照读取的确切顺序将所有包含/需要的文件压缩成一个大文件。

需要注意的是,作用域会发生变化,但所有东西都应用于“全局”作用域。你可以使用“global”关键字,在使用变量之前声明一个变量,并从全局作用域中导入到当前作用域中。所以当你想要使用来自另一个脚本的“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;

在包含crucialsettings.php文件之后,您的echo将起作用。

这样使用全局变量不好吗?我从各种来源得知“除非绝对必要,否则不要使用全局变量”。 - Sam
PHP中的所有内容都是全局的,在文件执行期间只是在私有范围内执行。也就是说,使用“global”关键字导入某些内容的行为只是声明对已经存在的变量的访问权限。良好的面向对象编程实践是将所有变量放入类中以避免作用域问题。使用该关键字并不是不好的,但设计代码时必须使用全局关键字可能会被其他程序员所鄙视。从性能方面来看,没有区别,因此最适合您的方法才是最好的。 - user1931103
谢谢Dan,我会再做一些研究,看看是否有其他替代方案。 - Sam
另外,我担心的是如果包含在对象内部,则函数和类定义会显得杂乱无序。 - Sam
这是一个完全不同的概念,但简单来说,在PHP中,您可以将函数定义为过程式(不在类或对象中)或对象方法(在类或对象内部)。编写一个以类作为参数的过程式函数,在我看来是对两种编程风格的虚拟亵渎。如果您需要一个函数来对类执行某些操作,请将其编写为类成员。如果您需要传递整个对象给函数使其正常工作,请回到绘图板上并找出问题所在。 - user1931103
显示剩余2条评论

1

看起来你的框架过于依赖非面向对象编程的内部结构。这不是一种理想的构建方式,但你可以通过循环遍历变量列表并将它们作为类/实例范围的一部分来实现你想要的功能。一个相当有用的函数是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

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