Php 致命错误:调用未定义的方法stdClass::My()
当我第二次调用函数My()时,我遇到了这个错误。第一次(当我打电话询问用户id时)一切似乎都很好。。精简代码:Php 致命错误:调用未定义的方法stdClass::My(),php,Php,当我第二次调用函数My()时,我遇到了这个错误。第一次(当我打电话询问用户id时)一切似乎都很好。。精简代码: class User { function My($field) { global $user; global $db; global $sessions; if ($sessions == 2) { $user = $db->Row("SELECT * FROM users WHE
class User {
function My($field) {
global $user;
global $db;
global $sessions;
if ($sessions == 2) {
$user = $db->Row("SELECT * FROM users WHERE username='".$_SESSION['username']."'");
return $user->$field;
}
}
}
$user = new User;
class Index {
function Startup() {
global $user;
$user_id = $user->My("user_id");
$name = $user->My("firstname")." ".$user->My("surname");
}
}
如果您有任何建议,我们将不胜感激。您必须首先初始化变量
$user = new User();
$user->my();
另外,除非您知道自己在做什么,否则请不要使用global。对不起,我的第一个答案不正确 因为在My()和Startup()中都定义了$user global,所以在这两种上下文中都引用了相同的数据 第一次一切正常,因为$user已初始化为代码中的某个用户对象。但是My()函数中的$db->Row()方法将全局$user更改为没有My()操作的stdClass
解决方案:删除My()中$user之前的单词global请停止。不要继续这样写下去。我很抱歉地说,但这不是PHP(或任何OO语言)中使用类的方式。请编辑您的问题,告诉我们您希望实现的目标,我相信我们可以为您找到更好的解决方案。感谢Mchl,我意识到我没有遵循常规的OOP方式,我目前正在阅读一篇文章,以使用更好的Global备选方案,但我不明白为什么我做的这么糟糕。你刚刚有了第一次体验。因为
$user
是一个全局对象,所以不能在代码中将其用作$user
。与$db
和$sessions
类似。相反,如果您将这些变量作为参数传递给构造函数,并将它们存储为User
类的实例变量,则可以避免这种风险。这只是一件事。请查找封装
关注点分离
多态性
Tim等主题,谢谢。我通过这样做解决了这个问题:$user\u id=user::My(“user\u id”)$姓名=用户::我的(“名字”)。用户::我的(“姓氏”);