PHP - 从包含脚本访问包含脚本中的变量

PHP - Accessing variables in an included script from an included script

我在主脚本的开头有一个文件列表 require_once

在其中一个文件中,我有一堆函数。
在另一个文件中,我有一堆常量(目前是变量,但它们本质上是常量)。

Main.php

require_once \Constants.php
require_once \Functions.php

在 main.php 中,我可以调用函数并从它们各自的脚本中调用常量...我还可以调用函数并将 Constants.php 中的常量作为参数传递给函数。
但是,我无法使用其中嵌入了常量的函数。
换句话说,我无法使用 Functions.php 中已经包含 Constants.php 文件中的变量的函数,但我可以使用 Functions.php 中没有的函数来自函数中其他包含文件的任何变量。

Function FirstFunction(){ echo $Constant1; return 1 }

FirstFunction() 使用 Constants.php 中的 $Constant1 并且不起作用。

Function SecondFunction($param){ echo $param; return 1 }

SecondFunction() 可以作为参数从 Constants.php 传递 $Constant1,它工作正常。

问题:

有没有办法让我能够使用我的 Main.php 调用一个函数文件和一个常量文件,并让函数文件使用常量文件中的变量,而无需在 Main.php?

如果我以菊花链方式连接它们(Main.php 调用 Functions.php;Functions.php 调用 Constants.php),这可行吗? (我尝试过这种方法,但还不够好,无法信任或排除这种方法)。

备注

我能找到的大部分信息都是关于使用包含文件中的变量,但不是专门关于使用其他包含文件中的变量的包含文件。

include() 就像被包含文件的内容字面上 cut/paste 到 include() 调用所在的位置:

variables.php:

<?php
$foo = 'bar';

test.php:

<?php
var_dump($foo); // notice: undefined variable
include('variables.php');
var_dump($foo); // string(3) "bar"

请注意,标准 PHP 变量范围规则适用。因此,如果您在函数内执行 include()

<?php

var_dump($foo); // notice: undefined variable
function test() {
   var_dump($foo); // notice: undefined variable
   include('variables.php');
   var_dump($foo); // string(3) "bar"
}
test(); // call the test function
var_dump($foo); // notice: undefined variable

注意 $foo 是如何不存在的 before/after 函数是 defined/called - 它只会存在于函数中,并且只有在它被包含之后才存在()。

如果您希望您的标准变量是真正的全局变量,则必须在全局范围内包含该文件,或者将它们声明为全局变量:

variables.php:

<?php
global $foo;
$foo = 'bar';

然后使用相同的脚本,$foo 将 "magically" 出现在最后的 var_dump 中,因为它已被设为全局。

这听起来像是一个简单的范围问题,与您的包含周期无关。

当您在 Constants.php 的根范围内创建 'constants' 正常 PHP 变量 ($name='value';) 时,必须在任何内部调用它们以后的功能,通过首先引用它们......像这样:

$name='value';

    /** other stuff **/

function Foo(){
    global $name;
    //You have access to $name here
}

不过,真正的解决方案是将您的常量实际定义为实常量,这使得它们在任何范围内都可用...像这样:

define('NAME','value');

    /** other stuff **/

function Foo(){
    //You immediately have access to NAME here
}

真正常量的唯一缺点是,它们是常量...意思是,它们不能在您的脚本中稍后更改。

您可以在此处阅读有关 'scope' 的更多信息:http://php.net/manual/en/language.variables.scope.php