【问题标题】:PHP include file that includes a file strange problem!PHP include file 包含一个文件奇怪的问题!
【发布时间】:2011-08-02 16:54:50
【问题描述】:

我面临一个奇怪的问题,包括 php 文件。让我给你看代码:

// constants.php
$MYSQL_HOST_PORT = 'localhost:3306';

// functions.php
include 'constants.php';
function getVar()  {
    echo $MYSQL_HOST_PORT;
}

// doSth.php
include 'functions.php';
echo $MYSQL_HOST_PORT; // The variable is visible and echoed normally as expected!
echo getVar(); // The variable is not echoed! its "".

有什么想法吗?

【问题讨论】:

  • 这是一个范围问题,而不是包含问题。函数在 PHP 中有自己的作用域。见php.net/manual/en/language.variables.scope.php
  • 好的!这是一个范围问题!你看我来自 c++、obj-c 等!谢谢!解决了。​​

标签: php variables include nested visibility


【解决方案1】:

首先,echo getVar(); 中的 echo 不会打印任何内容,因为 getVar 不会返回值。

其次,如果您(出于某种原因)希望 getVar() 本身正常工作,则需要添加 global $MYSQL_HOST_PORT; 行,使其在全局范围内查找 $MYSQL_HOST_PORT

【讨论】:

  • 如果getVar() 实际回显除未设置变量之外的某些内容,运行echo getVar() 仍会导致回显某些内容,尽管函数名称具有误导性。
  • echo getVar() 回显某些内容,但特定的 echo 不会导致任何输出。
  • 这是我的问题的一个例子。即使return $MYSQL_HOST_PORT 问题仍然存在。
  • 见我回答的第二部分,或菲尔布朗的回答。您在全局范围内声明 $MYSQL_HOST_PORT。通常,一个函数只会“看到”在它自己的本地范围内声明的变量,因此就getVar() 而言,$MYSQL_HOST_PORT 不存在。解决此问题的一种方法是在函数内为该变量添加global 声明,以便 PHP 将在全局范围内查找它。 (不过,完全避免使用全局变量可能会更好)。
  • 谢谢...不知道范围问题 - php 新手,对我来说有点奇怪!
【解决方案2】:

与其将$MYSQL_HOST_PORT 变量全球化,不如简单地将其设为常量?

// constants.php
define('MYSQL_HOST_PORT', 'localhost:3306');

如果包含constants.php,您可以在任何地方引用MYSQL_HOST_PORT 常量。

zerocrate's answer 中所述,该问题是范围界定问题。 getVar() 函数的封闭范围不包括 $MYSQL_HOST_PORT

【讨论】:

  • +1,或将其作为环境变量放入网络服务器配置中,并使用getenv() 引用它。
  • 我最终会使用定义!谢谢
【解决方案3】:

我可以看出错误的一件事是,echo getVar(); 行您没有从函数中获得返回值,因此您可以简单地自己编写 getVar();

【讨论】:

  • $MYSQL_HOST_PORT 变量不在getVar() 函数的范围内,因此它永远不会按原样工作。
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 2016-12-20
  • 1970-01-01
相关资源
最近更新 更多