PHP Фатальная ошибка:Использование $this, когда оно не находится в контексте объекта
-
23-09-2019 - |
Вопрос
У меня проблема:
Я пишу новое веб-приложение без фреймворка.
В моем 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
Решения:
Создайте объект и вызовите foobarfunc().
Вызовите 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();