我有一个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 ,它也是功能性的。那么我做错了什么?为什么我不能称这种方法?
答案 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;
}
}
?>