У меня есть проблема:
Я пишу новый 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();
Почему ошибка прибывает?
В моем 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();
Если вы вызываете 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
просто не существует.
Вместо этого вам нужно использовать this :: xyz ()
.
Чтобы узнать, в каком контексте вы находитесь, когда функция может вызываться как статически, так и в экземпляре объекта, хороший подход описан в следующем вопросе: Как определить, статический я или объект?
$ foobar = new foobar;
поместите класс foobar в $ foobar, не объект . Чтобы получить объект, вам нужно добавить круглые скобки: $ foobar = new foobar ();
Ваша ошибка заключается просто в том, что вы вызываете метод в классе, поэтому нет $ this
поскольку $ this
существует только в объектах.
Вы вызываете нестатический метод:
public function foobarfunc() {
return $this->foo();
}
Использование статического вызова:
foobar::foobarfunc();
При использовании статического вызова функция будет вызываться (даже если не объявлена как static
) , но поскольку нет экземпляра объекта, нет и $ this
.
Итак:
Здесь методы вашего класса используют текущий экземпляр класса, так как им нужен доступ к свойству $ foo
класса.
Это означает, что вашим методам нужен экземпляр класса, а это значит, что они не могут быть статическими.
Это означает, что вы не должны использовать статические вызовы: вы должны создать экземпляр класса и использовать объект для вызова методов, как вы это делали в последней части кода:
$foobar = new foobar();
$foobar->foobarfunc();
Для получения дополнительной информации, не стесняйтесь прочтите в руководстве по PHP:
Также обратите внимание, что вам, вероятно, не понадобится эта строка в вашем методе __ construct
:
global $foo;
Использование ключевого слова global
сделает $ foo
переменная, объявленная вне всех функций и классов, видимая изнутри этого метода ... И у вас, вероятно, нет такой переменной $ foo
.
Чтобы получить доступ к свойству класса $ foo
, вам нужно только использовать $ this-> foo
, как и вы.