Неустранимая ошибка 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

Решения:

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

  2. Вызовите 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();

Другие вопросы по тегам