Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP包含的变量在主文件中不可访问_Php_Include_Php Include - Fatal编程技术网

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

PHP包含的变量在主文件中不可访问,php,include,php-include,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_mo

我有一个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'
);

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

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

考虑这个例子:

<?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();
输出为:

## 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”
希望这有帮助:-)

请尝试使用
require
而不是
include
要注意的一点是
include
返回false或1(取决于是否成功),而不是包含文件的内容。不确定这是否是你的意图。@Yumecosmos不,只是想把它们包含到文件中!至少现在我已经找到了工作!那么您是说实例化我将文件包含到其中的类,然后通过$asd->varName;?访问属性??您必须初始化MyMain类,如果不想创建MyMain实例,则必须将函数设置为static
public static function use_mocks($filename='mocks.php){code}
并使用::而不是->
MyMain::use_mocks()调用函数
<?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();

?>