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中的常量作为参数传递给函数。
但是,我不能使用在其中嵌入常量的函数。
换句话说,我不能使用function. php中已经有Constants.php文件中的变量的函数,但是我可以使用function. 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;函数。php调用常量。php)这将工作吗?(我试过这种方法,但还不足以信任或排除这种方法)。

注意

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

这听起来像是一个简单的作用域问题,与include-cycle无关。

当你创建你的'常量'作为普通的php变量($name='value';),在Constants.php的根作用域,然后他们必须在任何以后的函数中调用,通过引用他们首先…这样的:

$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

include()的工作原理就好像被包含的文件的内容被直接剪切/粘贴到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在函数定义/调用之前/之后都不存在——它只存在于函数内部,并且只存在于它被包含()之后。

如果你希望你的标准变量是真正的全局变量,你必须在全局作用域中包含文件,或者声明它们为全局变量:

variables.php:

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

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