PHP使用包含在另一个包含文件中的包含文件中的对象

PHP使用包含在另一个包含文件中的包含文件中的对象,php,class,object,include,dependency-injection,Php,Class,Object,Include,Dependency Injection,我将直截了当地谈这个问题。在互联网上找不到它。也许这根本不可能,我不知道。我真的很喜欢使用“分而治之”的方法,这是我自己创造的。尽可能多地拆分文件以便于管理(小文件等) 但我的问题是: 我有5个文件: index.php inc/config.php inc/Database.class.php inc/sidebar.php inc/forms.php 好的,我所做的是: 在我的config.php文件中,我包含了Database.class.php文件并创建了一个对象 include 'D

我将直截了当地谈这个问题。在互联网上找不到它。也许这根本不可能,我不知道。我真的很喜欢使用“分而治之”的方法,这是我自己创造的。尽可能多地拆分文件以便于管理(小文件等)

但我的问题是:

我有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

(缩短了代码,但功能相同)

在我的侧边栏中,我有一个表单,供用户登录

在sidebar.php中,我只包括forms.php,这是forms.php: (我使用print_r调试我的文件,查看是否有任何返回,我省略了loginFormShow方法,因为它很长而且不相关)

因此,问题是什么。当我尝试调用函数loginFormProcess时,它不能使用对象$db

我可以用一个对象来做这个吗?因为在索引页上,我需要数据库中的一些其他数据。我是否需要为索引页和登录表单创建一个对象

还有其他解决办法吗? 如果我不清楚的话,我想再解释一下

干杯


Clemenz

最好的解决方案是将数据库对象传递给函数的参数,如下所示:

function loginFormProcess($user, $pass, Database $db) {
并使用适当的数据库对象调用它。这就是所谓的

试试这个:

function loginFormProcess($user, $pass)
{
    global $db;
    $db->select(blah blah some variables);
    $res = $db->getResult();
    print_r($res); 
}
function loginFormProcess($user, $pass)
{
    global $db;
    $db->select(blah blah some variables);
    $res = $db->getResult();
    print_r($res); 
}

仅供参考:

您需要将
$db
声明为全局

试试这个:

function loginFormProcess($user, $pass)
{
    global $db;
    $db->select(blah blah some variables);
    $res = $db->getResult();
    print_r($res); 
}
function loginFormProcess($user, $pass)
{
    global $db;
    $db->select(blah blah some variables);
    $res = $db->getResult();
    print_r($res); 
}

请参阅:

变量$db在config.php文件中创建为全局变量。这在loginFormProcess函数中是不可见的。您可以使用的shotcut解决方案是通过添加语句global$db来声明您使用全局变量的意图;作为函数中的第一条语句

作用域规则仍然适用于$db变量,即使它是一个对象而不是一个简单的标量。。。仅仅因为它是一个对象,并不能使它成为全局对象——因此它不在loginFormProcess()函数的作用域中。我如何在不创建另一个对象的情况下将其置于正确的作用域中。我只想将一个对象用于多个函数。可以这样做吗?您将其作为参数传递给loginFormProcess()函数,正如Madara的回答所示,正如您将任何其他变量传递给函数一样。执行此操作时,NetBeans会给我一个错误。我需要在表单中包含database.class.php吗?或者我需要先将$db传递给sidebar.php,然后再传递给forms.php。三个答案都是错误的做法。。。。传递$db作为参数,不要使用global作为通用的panacea,我应该如何传递它?它在config.php中声明,包含在index.php中。forms.php(我使用$db)包含在index.php中的sidebar.php中。该死,我包括了很多。对于我的解决方案,你可以在你的sidebar.php文件中添加global$db。但其他评论者是正确的。这个解决方案只不过是一个快速但肮脏的黑客。尝试学习面向对象的设计原则。从长远来看,这会节省你的时间。《面向对象的分析和设计》是一本好书,但我在config.php中声明了$db,而不是在database.class.php中。因此,如果我在netbeans中尝试这个,它会给我一个错误。所以我尝试使用这个:
函数loginFormProcess($user,$pass,Database::$db){
也不工作:
致命错误:在111行的something\inc\loginform.php中找不到类“Database”
@Clemenz:在这种情况下,一个是正常的。@Clemenz:不,我没有说
数据库::$db
,我说的是
数据库$db
。这叫类型提示。我知道你说的是Database$db,但那不起作用。但那不起作用work和netbeans希望我用::键入它,但这也不起作用。所以没有简单的解决方案?Autoloader没有那么简单。然后我将创建多个对象。非常感谢您的努力!@Clemenz:Autoloader非常简单。为什么您不能使用Autoloader?