无法从php类调用全局函数

时间:2013-09-13 02:32:59

标签: php functional-programming

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

db.php中

<?php

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

?>

user.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 ,它也是功能性的。那么我做错了什么?为什么我不能称这种方法?

2 个答案:

答案 0 :(得分:2)

我已经明白了!感谢所有有想法的人,但似乎问题是其他的。

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

<强> C:\ XAMPP \ PHP \梨\ db.php中

而不是我的。

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

答案 1 :(得分:0)

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

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

db.php中:

<?php

namespace anotherWorld; // added this ns for illustrative purposes

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

?>

user.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;
    }
}

?>

test.php的:

<?php

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

use helloWorld\User;

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

?>

产生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__ constant


如果命名空间是一个问题,而不影响DB的命名空间,这里有一个更新的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;
    }
}

?>