Фатальная ошибка PHP: Использование $this, когда не в контексте объекта


У меня проблема:

Я пишу новое веб-приложение без фреймворка.

В моем index.php Я использую: require_once('load.php');

И в load.php Я использую require_once('class.php'); для загрузки моего class.php.

В моем class.php У меня эта ошибка:

Неустранимая ошибка: Использование $this, когда не в контексте объекта в class.php на линии... (в данном примере это будет 11)

Пример того, как мой class.php является написано:

class foobar {

    public $foo;

    public function __construct() {
        global $foo;

        $this->foo = $foo;
    }

    public function foobarfunc() {
        return $this->foo();
    }

    public function foo() {
        return $this->foo;
    }
}

В моем index.php Я загружаю, может быть, foobarfunc() вот так:

foobar::foobarfunc();

Но также может быть

$foobar = new foobar;
$foobar->foobarfunc();

Почему возникает ошибка?

Author: Binit Ghetiya, 2010-02-28

8 answers

В моем index.php Я загружаю, возможно , foobarfunc() следующим образом:

 foobar::foobarfunc();  // Wrong, it is not static method

Но также может быть

$foobar = new foobar;  // correct
$foobar->foobarfunc();

Вы не можете вызвать метод таким образом, потому что это не статический метод.

foobar::foobarfunc();

Вместо этого вы должны использовать:

foobar->foobarfunc();

Если, однако, вы создали статический метод, что-то вроде:

static $foo; // your top variable set as static

public static function foo() {
    return self::$foo;
}

Затем вы можете использовать это:

foobar::foobarfunc();
 137
Author: Sarfraz, 2010-02-28 12:55:49

Вы вызываете нестатический метод:

public function foobarfunc() {
    return $this->foo();
}

Использование статического вызова:

foobar::foobarfunc();

При использовании статического вызова функция будет вызываться (даже если она не объявлена как static), но, поскольку нет экземпляра объекта, нет $this.

Итак:

  • Не следует использовать статические вызовы для нестатических методов
  • Ваши статические методы (или статически называемые методы) не могут использовать $this, который обычно указывает на текущий экземпляр класс, так как при использовании статических вызовов экземпляра класса нет.


Здесь методы вашего класса используют текущий экземпляр класса, так как им необходимо получить доступ к свойству $foo класса.

Это означает, что вашим методам нужен экземпляр класса, а это значит, что они не могут быть статическими.

Это означает, что вы не должны использовать статические вызовы: вы должны создать экземпляр класса и использовать объект для вызова методов, как вы делали в своем последнем часть кода:

$foobar = new foobar();
$foobar->foobarfunc();


Для получения дополнительной информации, не стесняйтесь читать в руководстве по PHP:


Также обратите внимание, что вам, вероятно, не нужна эта строка в вашем методе __construct:

global $foo;

Используя global ключевое слово сделает переменную $foo, объявленную вне всех функций и классов, видимой изнутри этого метода... И у вас, вероятно, нет такой переменной $foo.

Для доступа к $foo свойство класса, вам нужно только использовать $this->foo, как вы это сделали.

 22
Author: Pascal MARTIN, 2010-02-28 12:06:05

Если вы вызываете foobarfunc с оператором области разрешения (::), затем вы вызываете его статически , например, на уровне класса вместо уровня экземпляра, таким образом, вы используете $this, когда не в контексте объекта . $this не существует в контексте класса.

Если вы включите E_STRICT, PHP поднимет уведомление об этом:

Strict Standards: 
Non-static method foobar::foobarfunc() should not be called statically

Сделайте это вместо

$fb = new foobar;
echo $fb->foobarfunc();

В качестве примечания я предлагаю не использовать global внутри ваших классов. Если вам нужно что-то извне внутри вашего класса, передайте это через конструктор. Это называется Внедрением зависимостей , и это сделает ваш код намного более удобным для обслуживания и менее зависимым от внешних факторов.

 11
Author: Gordon, 2010-02-28 12:41:04

Сначала вы понимаете одну вещь, $этот внутри класса обозначает текущий объект.
То есть вы созданы вне класса для вызова функции или переменной класса.

Поэтому, когда вы вызываете функцию своего класса, такую как foobar::foobarfunc(), объект не создается. Но внутри этой функции вы написали возврат $this->foo(). Теперь здесь $это ничто. Вот почему его высказывание Использует $this, когда не в контексте объекта в class.php

Решения:

  1. Создайте объект и вызовите функцию foobarfunc().

  2. Вызовите foo(), используя имя класса внутри функции foobarfunc().

 6
Author: Ramasamy Kasi, 2014-07-11 06:42:10

Когда вы вызываете функцию в статическом контексте, $this просто не существует.

Вместо этого вам придется использовать this::xyz().

Чтобы выяснить, в каком контексте вы находитесь, когда функция может вызываться как статически, так и в экземпляре объекта, в этом вопросе описан хороший подход: Как определить, являюсь ли я статичным или объектом?

 4
Author: Pekka 웃, 2017-05-23 11:47:17

Быстрый метод: (новый foobar())->foobarfunc();

Вам нужно загрузить замену класса:

foobar::foobarfunc();

Автор:

(new foobar())->foobarfunc();

Или:

$Foobar = new foobar();
$Foobar->foobarfunc();

Или сделайте статической функцией для использования foobar::.

class foobar {
    //...

    static function foobarfunc() {
        return $this->foo();
    }
}
 4
Author: Hors Sujet, 2015-12-30 19:52:07

$foobar = new foobar; поместите класс foobar в $foobar, , а не объект. Чтобы получить объект, вам нужно добавить скобки: $foobar = new foobar();

Ваша ошибка заключается просто в том, что вы вызываете метод в классе, поэтому $this нет, так как $this существует только в объектах.

 0
Author: e-satis, 2010-02-28 12:21:00

Просто используйте метод класса, используя это foobar->foobarfunc();

 -1
Author: Manobendronath Biswas, 2015-11-30 17:01:41