Фатальная ошибка 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();
Почему возникает ошибка?
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();
Вы вызываете нестатический метод:
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(), объект не создается. Но внутри этой функции вы написали возврат $this->foo(). Теперь здесь $это ничто. Вот почему его высказывание Использует $this, когда не в контексте объекта в class.php
Решения:
Создайте объект и вызовите функцию foobarfunc().
Вызовите foo(), используя имя класса внутри функции foobarfunc().
Когда вы вызываете функцию в статическом контексте, $this
просто не существует.
Вместо этого вам придется использовать this::xyz()
.
Чтобы выяснить, в каком контексте вы находитесь, когда функция может вызываться как статически, так и в экземпляре объекта, в этом вопросе описан хороший подход: Как определить, являюсь ли я статичным или объектом?
Быстрый метод: (новый foobar())->foobarfunc();
Вам нужно загрузить замену класса:
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();