Фатальная ошибка PHP: Используя $this если не в контексте объекта

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

Я пишу новый WebApp без Платформы.

В моем 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();

Почему ошибка прибывает?

123
задан Binit Ghetiya 2 December 2016 в 14:19
поделиться

5 ответов

В моем 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();
165
ответ дан 24 November 2019 в 01:16
поделиться

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

11
ответ дан 24 November 2019 в 01:16
поделиться

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

Вместо этого вам нужно использовать this :: xyz () .

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

4
ответ дан 24 November 2019 в 01:16
поделиться

$ foobar = new foobar; поместите класс foobar в $ foobar, не объект . Чтобы получить объект, вам нужно добавить круглые скобки: $ foobar = new foobar ();

Ваша ошибка заключается просто в том, что вы вызываете метод в классе, поэтому нет $ this поскольку $ this существует только в объектах.

0
ответ дан 24 November 2019 в 01:16
поделиться

Вы вызываете нестатический метод:

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 , как и вы.

26
ответ дан 24 November 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: