【问题标题】:PHP declared variable, to another file that's included via functionPHP声明的变量,通过函数包含的另一个文件
【发布时间】:2017-08-04 22:07:02
【问题描述】:

我有一些问题,但我不明白。我有一个包含/要求文件的功能,它检查文件是否已经包含并且确实存在:

function __include($fileclass, $is_required=false) {
    static $already_included = array();
    // checking is set extension of php file, if not append it.
    if (substr($fileclass,-4)!=".php") $fileclass = $fileclass.".php";

    // if already included return;
    if (isset($already_included[$fileclass])) return true;

    // check if file exists:
    if (file_exists($fileclass)) {
        if (!$is_required) include $fileclass;
        else require $fileclass;

        $already_included[$fileclass] = 1;
        return true;
        }
    else {
        if ($is_required) die("can't find required file");
        return false;
        }
}

它工作得很好,但是当我开始处理这个项目时,我用它来包含一个文件,该文件使用父文件(包含它的那个)中的变量,但它放弃了Notice: Undefined variable: VARIABLE_NAME 的通知。

所以在编码时要清楚:

我有两个文件file_parent.phpfile_child.php,我试过了:

file_parent.php:

function __include($fileclass, $is_required=false) { /** i've mentioned it above **/ }
class __CONNECTION {
    private $test;
    public function __construct() {
        $this->test = "SOMETHING";
    }
};
$Connect = new __CONNECTION();
// here i used it to include the children file:
__include('file_child.php');

file_child.php:

print_r($Connect);

我得到Notice: Undefined variable: Connect

当我更改 file_parent.php 我的功能包括:

__include('file_child.php');

标准包括:

include 'file_child.php';

一切正常,变量已定义并被打印出来。

我猜function 有一些问题,但有人可以解释发生这种情况的真正原因是什么,并且是否有可能修复它以通过function 包含/要求工作并且不会丢失以前文件中的变量。

谢谢!

【问题讨论】:

  • global $Connect 应该可以解决问题
  • 当我使用global 时,我必须使用我不想要的$GLOBALS['Connect'],因为正如我所说,它适用于常规包含。
  • 您是否尝试过使用 require() 而不是 include 来检查是否存在误解?
  • 是的,我试过了,requireinclude 都可以工作,当在函数之外,当在函数内时,它们包含在内,但变量仍然未定义..正如@Tom涂鸦者说,global 可以解决它,使用 $GLOBALS['Connect'] 但我希望在没有 global 的情况下做到这一点..

标签: php function include


【解决方案1】:

好吧,我怎么看,当我打印所有定义的变量 (get_defined_vars()) 时,我得到了这个:

Array
(
    [fileclass] => test_file2.php
    [is_required] => 
    [already_included] => Array
        (
        )

)

这意味着变量被传递,但只有一个存在于函数中(因为函数是临时的),所以我可以将变量传递给function,但因为它不是我需要的唯一变量我将使用以下两种方式之一:

global 正如@Tom Doodler 在评论中所说,后来用$GLOBALS 捕捉它

或使用function 进行检查,如果存在则仅返回路径/如果文件不存在则返回空字符串,然后仅返回include/require

谢谢大家。

我不会接受这个答案,所以如果有人能更好地解释函数在这个解决方案中的行为方式,我会接受。

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多