PHP 包含主文件中无法访问的变量

标签 php include php-include

我有一个 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.php的示例:

<?php 

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

这个包含的文件中有几个模拟,我希望能够在我的 main.php 中使用这些模拟作为变量。由于某种原因,在我尝试在包含后 print_r() 它们后,它抛出了 500 ,表示这些都没有定义。

最佳答案

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

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

考虑这个例子:

<?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"

这可能不方便或不符合您的预期,但这就是面向对象的工作原理。这就是为什么将变量声明“外包”到单独的文件中并不常见。

相反,如果您确实必须通过将这些变量交给类的构造函数来将它们分开,那么您可以“注入(inject)”这些变量。或者与该类关联的工厂。

关于PHP 包含主文件中无法访问的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34662510/

相关文章:

android - 为什么我们不应该将每个包含的 Android XML 布局包装在一个 <merge> 对中?

c - 包括来自其他目录的 C 头文件

php - PHP 是否正式支持 "including"函数?

javascript - Jquery $.post 未按预期工作

php - 将相同的 ID 显示为单个 ID

javascript - 在 iMacros 中重新加载页面后,如何定位名称每次都在变化的表单输入字段?

php - MySQL 左连接

php - 如何在每个页面上正确包含 PHP header

php - php中显示的存储文件名包含错误

html - 使用 php 包含在 html 文件中