PHP Неустранимая ошибка: использование $this, если не в объектном контексте
У меня проблема:
Я пишу новый WebApp без рамки.
В моем index.php я использую: require_once('load.php');
И в load.php я использую require_once('class.php');
для загрузки моего class.php.
В моем классе .php у меня есть эта ошибка:
Неустранимая ошибка: использование $this, если не в объектном контексте в class.php on line... (в этом примере это будет 11)
Пример того, как пишется мой класс .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();
Почему возникает ошибка?
Ответы
Ответ 1
В моем 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();
Ответ 2
Вы вызываете нестатический метод:
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
class-property, вам нужно использовать $this->foo
, как и вы.
Ответ 3
Если вы вызываете 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
внутри ваших классов. Если вам нужно что-то снаружи внутри вашего класса, пройдите через конструктор. Это называется Dependency Injection, и это сделает ваш код намного более удобным и менее зависимым от внешних вещей.
Ответ 4
Сначала вы понимаете одно: $this внутри класса обозначает текущий объект.
То есть вы создаете сторону класса для вызова функции или переменной класса.
Поэтому, когда вы вызываете свою функцию класса foobar:: foobarfunc(), объект не создается.
Но внутри этой функции вы вернете $this- > foo(). Теперь вот $это ничего. Вот почему его высказывание Используя $this, когда нет в объектном контексте в class.php
Решения:
Ответ 5
Когда вы вызываете функцию в статическом контексте, $this
просто не существует.
Вместо этого вам нужно будет использовать this::xyz()
.
Чтобы узнать, в каком контексте вы находитесь, когда функция может быть вызвана как статически, так и в экземпляре объекта, в этом вопросе указывается хороший подход: Как сделать указать, является ли Im static или объектом?
Ответ 6
Быстрый метод: (новый foobar()) → foobarfunc();
Вам нужно загрузить замену своего класса:
foobar::foobarfunc();
:
(new foobar())->foobarfunc();
или:
$Foobar = new foobar();
$Foobar->foobarfunc();
Или сделайте статическую функцию для использования foobar::
.
class foobar {
//...
static function foobarfunc() {
return $this->foo();
}
}
Ответ 7
$foobar = new foobar;
поместите класс foobar в $foobar, не объект. Чтобы получить объект, вам нужно добавить скобки: $foobar = new foobar();
Ваша ошибка просто в том, что вы вызываете метод в классе, поэтому нет $this
, поскольку $this
существует только в объектах.
Ответ 8
так просто:..!
просто вставьте static
перед вашим property
и вашим function
;
Ответ 9
Просто используйте метод класса, используя этот foobar->foobarfunc();