Php 致命错误:调用未定义的方法stdClass::My()

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

当我第二次调用函数My()时,我遇到了这个错误。第一次(当我打电话询问用户id时)一切似乎都很好。。精简代码:

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”)$姓名=用户::我的(“名字”)。用户::我的(“姓氏”);