PHP包含主文件中不可访问的变量


PHP included variables not accessible in main file

我有一个main.php文件,我正在通过它运行某些函数。当我包含另一个只定义了一堆变量的文件时,我无法访问main.php文件中的那些变量。

main.php示例:

class MyMain { 
    public function include_mocks() {
        return include 'mocks.php';
    }
    public function use_mocks() {
        $included = $this->include_mocks();
        if($included == true) {
            print_r($mock1); die();
        }
    }
}

包含的文件mocks.pp:示例

<?php 
$mock1 = array(
    'key1' => 'some data',
    'key2' => 'other data'
);

这个包含的文件中有几个mock,我希望能够在我的main.php中使用这些mock作为变量。出于某种原因,它给了我一个500,说在我尝试在include之后打印_r()后,这些都没有定义。

这里的问题是,您在一个方法的范围内定义这些函数,同时试图在另一个方法范围内访问它们。这是两回事。

要完成类似的操作,您必须在全局范围中声明变量(被认为是错误的做法),或者将其存储在对象属性中。

考虑这个例子:

<?php
$varInGlobal = "I am defined globally";
class myClass {
    private $varInClass = "I am defined in the class";
    private $varFromFile;
    function __construct() {
        require 'includeVar.php';
        $this->varFromFile = $varInFile;
        echo "## in constructor: 'n";
        var_dump($varInFile);
    }
    function showMyVars() {
        echo "** in class: 'n";
        var_dump($varInClass);
        var_dump($this->varInClass);
        echo "** in global: 'n";
        var_dump($varInGlobal);
        var_dump($GLOBALS['varInGlobal']);
        echo "** in file: 'n";
        var_dump($varInFile);
        var_dump($GLOBALS['varInFile']);
        echo "** in property: 'n";
        var_dump($this->varFromFile);
    }
}
$obj = new myClass;
$obj->showMyVars();

包含的文件includeVar.php:

<?php
$varInFile = "I am defined externally";

输出为:

## in constructor:
string(23) "I am defined externally"
** in class:
NULL
string(25) "I am defined in the class"
** in global:
NULL
string(21) "I am defined globally"
** in file:
NULL
NULL
** in property:
string(23) "I am defined externally"

这可能不方便,也不符合您的预期,但这就是对象定向的工作方式。这就是为什么将变量声明"外包"到单独的文件不是一种常见的做法。

相反,如果您真的必须通过将这些变量交给类的构造函数来保持它们的独立性,那么您可以"注入"这些变量。或者指向与该类关联的工厂。

试试这个

<?php
Class MyMain
{
    public function use_mocks($filename = 'mocks.php')
    {
        if(file_exists($filename))
        {
            if(include($filename))
            {
                print_r($mock1);           
            }
        }
        die;
    }
}
$asd = new MyMain();
$asd->use_mocks();
?>

file_exists()在$filename不存在时阻止电子警告。您可以将所需的文件名传递给该函数,如果不传递,该函数将使用默认值"mocks.php"希望这有帮助:-)