我有一个文件列表,我在我的主脚本的开头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中,因为它已被设置为全局。