困惑于“在不在对象上下文中时使用$ this”致命错误

时间:2013-06-18 13:19:11

标签: php oop this fatal-error

我在stackoverflow上搜索了“当不在对象上下文时使用$ this”,但我无法得到答案,所以我在这里问。

我会在这里复制我的代码,这样你和我就不会感到困惑:

错误在第一个IF语句的此代码中($ this-> checkConnection()):

public function randomLocation() {
        if ($this->checkConnection()) {
            $fetch = array();
            $character = $this->getCharacter($_GET['action']);
            $locations = Controller_Core_Database::getObjects('Model_Game_Location');
            foreach ($locations as $location) {
                $fetchLocation = $location->getLocationNameShort();
                $fetch[] = $fetchLocation;
            }
            $newLocation = rand(0,31);
            $character->setLocation($fetch[$newLocation]);
            Controller_Core_Database::update($character);
        }
    }

但是我有很多以'checkConnection'开头的函数,除了这个函数之外还有一些工作。这在我看来很奇怪(虽然我仍然是OOP PHP的初学者)

所以这是我的checkConnection函数:

public function checkConnection() {
        $mysqli = Controller_Core_Database::getDB();
        if ($mysqli != null) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

Controller_Core_Database :: getDB()代码是:

public static function getDB() {
            self::$mysqli = new mysqli('','','','');
            return self::$mysqli;
        }

我出于安全目的删除了这些信息 以下是一个功能完美

的示例
public function createItem() {
        $view = new Controller_Core_View();
        $view->setViewFile("game/createItem.php");
        if ($this->checkConnection()) { 
            $item = Controller_Core_Database::getObjects('Model_Game_Item');
            $enchantment = Controller_Core_Database::getObjects('Model_Game_Itemenchantment');
            $view->assign("item", $item);
            $view->assign("enchantment", $enchantment);
        }
        return $view->render();
    }

我看不出两个有效且无效的功能有什么不同,我希望你能帮助我

1 个答案:

答案 0 :(得分:0)

您没有指定,如何调用 randomLocation()方法。

我想你正在静态地调用非静态方法 - 这就是为什么你不在对象上下文中。

如果是这样,请考虑重写对 randomLocation()方法的调用以使用对象上下文 - e.i。

$x = new YourObjectName();

$x->randomLocation();

或将 checkConnection()方法重写为静态,并在 randomLocation()方法中静态调用。