В PHP фатальная ошибка: используя $this, когда не в контексте объекта


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

Я пишу новое веб-приложение без рамок.

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

и загрузить.php я использую require_once('class.php'); загрузить класса.php.

в своем класса.php у меня есть эта ошибка:

фатальная ошибка: используя $this, когда не в контексте объекта класса.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;
    }
}

в своем

8 105

8 ответов:

в мой индекс.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 свойства класса.

это означает, что ваши методы нуждаются в экземпляре класса - что означает, что они не могут быть статическими.

это означает, что вы не должны использовать статические вызовы : вы должны instanciate в класс, и использовать объект для вызова методов, как вы сделали в вашей последней части кода:

$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();

на боковой ноте, я предлагаю не использовать global внутри своих классов. Если вам нужно что-то извне внутри вашего класса, передать его через конструктор. Это называется Инъекции Зависимостей и это сделает ваш код гораздо более ремонтопригодным и менее зависимым от внешних вещей.

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

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

решения:

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

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

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

вам придется использовать this::xyz() вместо.

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

быстрый способ : (new foobar ()) - >foobarfunc ();

вам нужно загрузить свой класс заменить:

foobar::foobarfunc();

by:

(new foobar())->foobarfunc();

или :

$Foobar = new foobar();
$Foobar->foobarfunc();

или статический

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

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

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