我会直截了当地说到这一点。似乎无法在互联网上的任何地方找到它。也许它甚至不可能,我也不知道。我真的很喜欢使用方法"划分和规则",自己创建它。尽可能多地拆分文件以便于管理(小文件等)。
但这是我的问题:
我有5个文件:
index.php
inc/config.php
inc/Database.class.php
inc/sidebar.php
inc/forms.php
好的,我所做的就是:
在我的config.php文件中,我包含了Database.class.php文件并创建了一个对象。
include 'Database.class.php';
$user = "root";
$pass = "";
$host = "localhost";
$database = "blah blah";
$db = new Database($user, $pass, $host, $database);
$db->connect();
所以我在index.php文件中包含了这个config.php和sidebar.php。
(缩短了代码,但功能相同)
include 'inc/config.php';
include 'inc/sidebar.php';
在我的侧边栏中,我有一个表单,供用户登录。
在sidebar.php中的我只包含forms.php,这是forms.php: (我使用print_r来调试我的文件,看看是否有任何返回,我省略了方法loginFormShow,因为它很长且不相关)
function loginFormProcess($user, $pass)
{
$db->select(blah blah some variables);
$res = $db->getResult();
print_r($res);
}
if (!isset($_POST['submit'])) {
loginFormShow();
} else {
if ($_POST['user'] == "")
{
loginFormShow(1);
}
else if ($_POST['pass'] == "")
{
loginFormShow(2);
}
else
{
$user = $_POST['user'];
$pass = $_POST['pass'];
loginFormProcess($user, $pass);
}
}
因此,问题是什么。当我尝试调用函数loginFormProcess时,它无法使用对象$ db。
我可以使用1个对象吗?因为在索引页面上我将需要来自数据库的一些其他数据。我是否需要为索引页面创建一个对象,为登录表单创建一个对象?
还有其他解决方案吗? 如果我不清楚,我想提供更多解释。
干杯,
Clemenz
答案 0 :(得分:3)
最好的解决方案是将数据库对象传递给函数的参数,如下所示:
function loginFormProcess($user, $pass, Database $db) {
并使用适当的Database对象调用它。这就是所谓的 dependency-injection 。
答案 1 :(得分:0)
试试这个:
function loginFormProcess($user, $pass)
{
global $db;
$db->select(blah blah some variables);
$res = $db->getResult();
print_r($res);
}
答案 2 :(得分:0)
您需要将$db
声明为全球。
试试这个:
function loginFormProcess($user, $pass)
{
global $db;
$db->select(blah blah some variables);
$res = $db->getResult();
print_r($res);
}
请参阅:http://www.php.net/manual/en/language.variables.scope.php
答案 3 :(得分:0)
变量$ db在config.php文件中创建为全局变量。这在loginFormProcess函数内部是不可见的。您可以使用的一个shotcut解决方案是通过添加语句global $ db来声明您使用全局变量的意图;作为你职能中的第一个陈述