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

Решения:

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

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

Ответ 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();