2012-11-29 127 views
1

我将直截了当地指出这一点。似乎无法在互联网上的任何地方找到它。也许这是不可能的,我不知道。我真的很喜欢用“分而治之”的方法,自己创造它。尽可能多地分割文件以便于管理(小文件等)。PHP使用另一个包含文件中的包含文件中的对象

但这里是我的问题:

我有5个文件:

index.php 
inc/config.php 
inc/Database.class.php 
inc/sidebar.php 
inc/forms.php 

好吧,我做了什么是这样的:

在我的config.php文件

我包括数据库。 class.php文件并创建一个对象。

include 'Database.class.php'; 

$user = "root"; 
$pass = ""; 
$host = "localhost"; 
$database = "blah blah"; 

$db = new Database($user, $pass, $host, $database); 
$db->connect(); 

所以我将这个config.php和sidebar.php包含在我的index.php文件中。

(缩短了的代码,但它的作用是相同的)

include 'inc/config.php'; 
include 'inc/sidebar.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

+2

作用域规则仍然适用于$ db变量,即使它是一个对象而不是一个简单的标量......仅仅因为它是一个对象,不会使它成为全局的 - 所以它不是' t在你的loginFormProcess()函数中的作用域 –

+0

我如何在没有创建另一个对象的情况下在正确的作用域中获取它。我只想为一个对象使用多个函数。这是否可行? – Clemenz

+0

您将它作为参数传递给loginFormProcess()函数,正如Madara的答案所示,完全如同您将任何其他变量传递给函数一样 –

回答

3

最好的解决办法是将数据库对象传递给函数的参数如下:

function loginFormProcess($user, $pass, Database $db) { 

并用适当的数据库对象调用它。这就是所知的

+0

但我在config.php中声明$ db不在database.class.php中。所以,如果我在netbeans中尝试这个,它会给我一个错误。所以我尝试使用下面的代码: 'function loginFormProcess($ user,$ pass,Database :: $ db){' 不能正常工作:致命错误:在'inc \ loginform.php'中找不到类'Database'在线111' – Clemenz

+0

@Clemenz:在这种情况下,[标签:自动加载器]是有序的。 –

+0

@Clemenz:不,我没有说'Database :: $ db',我说'Database $ db'。它被称为类型提示。 –

0

试试这个:

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

参考:http://php.net/manual/en/language.variables.scope.php

+2

三个答案,所有传播不良行为....通过$ db作为一个理论,不要使用全球通用万能药 –

+0

我应该如何通过这个?它在config.php中声明,包含在index.php中。和forms.php(我使用$ db)包含在index.php中包含的sidebar.php中。该死的,我包括很多。 – Clemenz

+0

对于我的解决方案,您可以在您的sidebar.php文件中添加全局$ db。但其他评论者是正确的。这个解决方案只不过是一个快速而肮脏的破解。尝试研究面向对象的设计原则。从长远来看,这将节省您的时间。一本好书是“首先面向对象的分析和设计”。 – Thomas

0

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

相关问题