У меня проблема:
Я пишу новое 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();
Почему появляется ошибка?
Ответы:
Вы не можете вызывать метод таким образом, потому что это не статический метод.
Вместо этого вы должны использовать:
Однако если вы создали статический метод что-то вроде:
тогда вы можете использовать это:
источник
$this->foo
является членом класса, а$foo
является просто переменной в области видимости функции (импортированной из глобальной области видимости). Имена функций с тем же именем, что и член, также не являются проблемой.$this
статический метод.::
. Это противE_STRICT
, но он делает работу, пока тело метода не ссылается на сферу экземпляра, например , использование$this
. Такжеself::foo
не буду указывать на$this->foo
. Он ссылается на константу класса . Оба,self::foo
иself::$foo
вызовут фатальную ошибку.Вы вызываете нестатический метод:
Использование статического вызова:
При использовании статического вызова функция будет вызываться (даже если не объявлена как
static
) , но, поскольку экземпляра объекта нет, нет$this
.Так :
Здесь методы вашего класса используют текущий экземпляр класса, поскольку им необходимо получить доступ к
$foo
свойству класса.Это означает, что вашим методам нужен экземпляр класса, а это значит, что они не могут быть статическими.
Это означает, что вам не следует использовать статические вызовы: вы должны создать экземпляр класса и использовать объект для вызова методов, как вы это делали в последней части кода:
Для получения дополнительной информации не стесняйтесь читать в руководстве по PHP:
Также обратите внимание, что вам, вероятно, не нужна эта строка в вашем
__construct
методе:Использование
global
ключевого слова сделает$foo
переменную, объявленную вне всех функций и классов, видимой изнутри этого метода ... И у вас, вероятно, нет такой$foo
переменной.Чтобы получить доступ к
$foo
свойству класса , вам нужно только использовать$this->foo
, как и вы.источник
Если вы вызываете
foobarfunc
с помощью оператора области разрешения (::
), то вы вызываете его статически , например, на уровне класса, а не на уровне экземпляра, поэтому вы используете,$this
когда не в контексте объекта .$this
не существует в контексте класса.Если вы включите
E_STRICT
, PHP выдаст уведомление об этом:Сделай это вместо
В качестве примечания я предлагаю не использовать
global
внутри ваших классов. Если вам нужно что-то извне внутри вашего класса, передайте это через конструктор. Это называется внедрением зависимостей, и это сделает ваш код более удобным в обслуживании и менее зависимым от внешних факторов.источник
Сначала вы понимаете одну вещь: $ this внутри класса обозначает текущий объект .
То есть вы созданы вне класса для вызова функции или переменной класса.
Поэтому, когда вы вызываете функцию своего класса, например foobar :: foobarfunc (), объект не создается. Но внутри этой функции вы написали return $ this-> foo (). Теперь здесь $ это ничего. Вот почему он говорит Использование $ this, когда не в контексте объекта в class.php
Решения:
Создайте объект и вызовите foobarfunc ().
Вызовите foo (), используя имя класса внутри foobarfunc ().
источник
Когда вы вызываете функцию в статическом контексте,
$this
просто не существует.Вы должны использовать
this::xyz()
вместо этого.Чтобы узнать, в каком контексте вы находитесь, когда функция может вызываться как статически, так и в экземпляре объекта, хороший подход изложен в следующем вопросе: как определить, статический ли я или объект?
источник
Быстрый способ: (new foobar ()) -> foobarfunc ();
Вам нужно загрузить свой класс replace:
по :
или :
Или сделайте статическую функцию для использования
foobar::
.источник
$foobar = new foobar;
поместите класс foobar в $ foobar, а не объект . Чтобы получить объект, нужно добавить скобки:$foobar = new foobar();
Ваша ошибка заключается в том, что вы вызываете метод класса, поэтому его нет,
$this
поскольку он$this
существует только в объектах.источник
Мне кажется, это ошибка PHP. Ошибка
появляется в функции using
$this
, но ошибка в том, что вызывающая функция использует нестатическую функцию как статическую. То есть:Пока ошибка здесь:
источник
Просто используйте метод Class, используя это
foobar->foobarfunc();
источник