【问题标题】:PHP - Accessing variables in an included script from an included scriptPHP - 从包含的脚本访问包含的脚本中的变量
【发布时间】:2015-07-14 16:18:45
【问题描述】:

我有一个文件列表,我在主要脚本的开头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)这会起作用吗? (我尝试过这种方法,但还不足以信任或排除这种方法)。

注意

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

【问题讨论】:

  • 不确定问题出在哪里,因为您还没有发布任何上述功能不起作用的代码示例。然而,我有一个偷偷摸摸的怀疑,这是因为常量被定义在 inside 函数..?
  • 是的,这正是我要问的。我的函数使用函数本身内部(或内部)另一个包含文件中的变量/常量。如果您需要将其可视化,我可以发布一个通用示例。

标签: php scope include


【解决方案1】:

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

当您在Constants.php 的根范围内将“常量”创建为普通 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
}

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

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

【讨论】:

    【解决方案2】:

    include() 的工作方式就好像被包含的文件的内容实际上被剪切/粘贴到了 include() 调用所在的位置:

    变量.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 在定义/调用函数之前/之后是如何不存在的 - 它只会存在于函数内部,并且只存在于它被包含之后()。

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

    变量.php:

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

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

    【讨论】:

    • 您好,感谢您的回答。正如我的 OP 中所述,“我有一个文件列表,我需要在我的主脚本的开头使用一次。” require_once \Constants.php require_once \Functions.php 如您所见,首先包含的是 Constants.php 或包含我所有变量的文件,然后是包含函数的文件。我相信关于我何时何地做我的包括没有问题。但它确实为更完整的答案添加了更多相关信息。
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 2013-11-19
    • 2019-07-20
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多