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

StackOverflow https://stackoverflow.com/questions/2350937

Вопрос

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

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

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

И в load.php Я использую require_once('class.php'); чтобы загрузить мой class.php.

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

Фатальная ошибка:Использование $this, когда оно не находится в контексте объекта в class.php on line ...(в данном примере это было бы 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();

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

Это было полезно?

Решение

В моем 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();

Другие советы

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

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, как ты это сделал.

Если вы вызываете 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 внутри ваших классов.Если вам нужно что-то извне внутри вашего класса, передайте это через конструктор.Это называется Внедрение зависимостей и это сделает ваш код намного более удобным в обслуживании и менее зависимым от внешних факторов.

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

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

Решения:

  1. Создайте объект и вызовите foobarfunc().

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

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

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

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

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

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

foobar::foobarfunc();

Автор: :

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

или :

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

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

class foobar {
    //...

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top