2

我有一个使用一些功能元素和一些 OOP 元素的 php 项目,但似乎将两者混合会导致问题。以下是导致错误的文件:

数据库文件

<?php

function parse_db_entry($from, &$to){
    //Function code here
}

?>

用户.php

<?php

require_once 'DB.php';

class User{

    //Properties

    public function __construct(){
        //ctor
    }

    public static function load_user($email, $password){

        $entry = //Make MySQL Request
        $user = new User();

        parse_db_entry($entry, $user);

        return $user;

    }
}

?>

一切都按原样工作,除了parse_db_entry抛出的调用:

致命错误:调用未定义函数 parse_db_entry()

我可以访问DB.php中的其他内容,例如,如果我在那里创建了一个类,我可以毫无错误地实例化它,如果我将函数移到User.php中,它也可以正常工作。那么我做错了什么?为什么我不能调用这个方法?

4

2 回答 2

2

我想通了!感谢所有有想法的人,但似乎问题出在其他地方。

调用时require_once 'DB.php',php实际上正在获取文件:

C:\xampp\php\pear\DB.php

而不是我的。

这可能是 XAMPP 独有的问题,但只需简单地重命名我的文件即可DBUtil.php修复所有问题。

于 2013-09-13T03:24:58.163 回答
0

这是一个延伸,我完全是在黑暗中拍摄,但是......

你确定parse_db_entry是在全局或用户的命名空间中吗?注意:我在这里和那里添加了几行用于测试/调试。

数据库.php:

<?php

namespace anotherWorld; // added this ns for illustrative purposes

function parse_db_entry($from, &$to){
    echo 'called it';
}

?>

用户.php:

<?php

namespace helloWorld; // added this ns for illustrative purposes

class User {
    //Properties
    public function __construct(){
        //ctor
    }
    public static function load_user($email, $password){
        $entry = //Make MySQL Request
        $user = new User();
        parse_db_entry($entry, $user);
        return $user;
    }
}

?>

测试.php:

<?php

require_once 'DB.php';
require_once 'User.php';

use helloWorld\User;

$a = new User();
$a->load_user('email','pass');
echo 'complete';

?>

Yields Fatal error: Call to undefined function helloWorld\parse_db_entry() in User.php on line 13,但是当删除 DB.php ( namespace anotherWorld) 中的 NS 声明从而放入parse_db_entry全局 NS 时,它运行得很好。

要验证,请使用__NAMESPACE__常量


如果命名空间有问题,在不影响数据库命名空间的情况下,这里是一个更新的 User.php:

<?php

namespace helloWorld;

use anotherWorld; // bring in the other NS

class User {
    //Properties
    public function __construct(){
        //ctor
    }
    public static function load_user($email, $password){
        $entry = //Make MySQL Request
        $user = new User();
        anotherWorld\parse_db_entry($entry, $user); // call the method from that NS
        return $user;
    }
}

?>
于 2013-09-13T03:02:32.670 回答