Jef*_*Fay 8 php scope require-once
我是一个php新手(但是其他语言的长期开发人员),我正在尝试"PHP,MySQL和JavaScript"中的一些示例数据库连接.它显示了一个包含数据库连接变量(服务器名,用户名,密码,数据库等)的示例文件.我有一个php文件,它有一些我写的函数,其中一个有一些SQL查询.无论出于何种原因,在该文件中调用require_once不会输出任何错误(我已经配置了E_ALL),但我的数据库php文件中的那些变量是null.
我用该函数中的所有变量调用了一个回声,看看它到底发生了什么,当然它打印出一个空白行.世界上什么超出了范围?我不得不错过一些简单的东西.
这是我正在做的一个例子
db_login.php
<?php
$db_server = 'localhost';
// ....
?>
Run Code Online (Sandbox Code Playgroud)
的functions.php
<?php
require_once('db_login.php');
function myfunction() {
echo "$db_server";
// ...
}
?>
Run Code Online (Sandbox Code Playgroud)
叫我疯了,但这应该不够简单吗?
PHP没有像Javascript这样的函数作用域,因此您无法访问db_login.php函数内部的变量functions.php.
有多种方法可以解决这个问题.由于您可能使用服务器名称,全局常量可能是一个很好的解决方案,因为没有什么可以改变它们.
在您的情况下,您可以这样做:
<?php
require_once('db_login.php');
// You have access to $db_server here.
// Create a constant.
define("DB_SERVER", $db_server);
function myfunction() {
// Using a constant. Note that there is no "$".
echo DB_SERVER ;
// Constants are interpreted inside double quotes too
echo "\nMy constant is DB_SERVER";
// ...
}
?>
Run Code Online (Sandbox Code Playgroud)
在您的情况下,将服务器名称作为常量可能是合适的.如果您要处理要作为真实变量处理的内容,可以通过值或引用将变量传递给函数:
myfunction($variable);
// by value
function myfunction($pass_variable_to_me_by_value)
{
echo $pass_variable_to_me_by_value;
// ...
}
function myfunction(& $pass_variable_to_me_by_reference)
{
echo $pass_variable_to_me_by_reference;
// ...
}
Run Code Online (Sandbox Code Playgroud)
作为注释,在您的情况下,在函数内使用global关键字或$ GLOBALS数组与通过引用传递基本相同.,但是如果你没有从全球范围传递,它们可能会非常不同(例如在一个类或另一个函数中).
您声明的变量db_login.php是全局变量.为了在函数中访问它们,您需要使用$GLOBALS变量,例如$GLOBALS['db_server'],或者使用global关键字将它们声明为函数内的全局变量,例如global $db_server.