Неустранимая ошибка PHP: использование $this, когда оно не в контексте объекта
У меня проблема:
Я пишу новое WebApp без Framework.
В моем 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 ответов
В мой 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, что обычно указывает на текущий экземпляр класса, так как при использовании static-вызовов не существует экземпляра класса.
Здесь методы вашего класса используют текущий экземпляр класса, так как им нужно получить доступ к $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();
На sidenote, я предлагаю не использовать global
внутри ваших классов. Если вам нужно что-то извне внутри вашего класса, пропустите это через конструктор. Это называется Dependency Injection, и оно сделает ваш код более понятным и менее зависимым от внешних вещей.
Сначала вы понимаете одну вещь: $this внутри класса обозначает текущий объект.
То есть вы созданы вне класса для вызова функции или переменной класса.
Поэтому, когда вы вызываете функцию класса, например, foobar::foobarfunc(), объект не создается. Но внутри этой функции вы написали return $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();
}
}
Мне кажется, это ошибка PHP. Ошибка
'Неустранимая ошибка: Неперехваченная ошибка: использование $this, когда не в контексте объекта в'
появляется в функции с помощью $this
, но ошибка в том, что вызывающая функция использует нестатическую функцию как статическую. Т.е.:
Class_Name
{
function foo()
{
$this->do_something(); // The error appears there.
}
function do_something()
{
///
}
}
Пока ошибка здесь:
Class_Name::foo();
$foobar = new foobar;
поместите класс foobar в $foobar, а не объект. Чтобы получить объект, вам нужно добавить круглые скобки: $foobar = new foobar();
Ваша ошибка просто в том, что вы вызываете метод в классе, поэтому нет $this
поскольку $this
существует только в объектах.
Просто используйте метод Class, используя это foobar->foobarfunc();