PHP Неустранимая ошибка: использование $ this, если не в объектном контексте

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

Я пишу новый WebApp без рамки.

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

И в load.php я использую require_once('class.php'); загрузить мой класс.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(); 

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

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

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

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

Решения:

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

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

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

Вы должны использовать this::xyz() .

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

Быстрый метод: (new 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 существует только в объектах.

так просто : ..!

просто вставьте static перед своим property и вашей function ;

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