Я только начал изучать OOPS в php. Я написал простую программу для реализации наследования. Я получаю фатальную ошибку $ this, если не в контексте объекта. Может ли кто-нибудь объяснить мне эту ошибку, что это значит? вот мой код:
<?php class human{ public $gender; public function _construct($gender) { $this->gender=$gender; echo $this->get_gender(); } public function get_gender() { return $this->gender; } } class person extends human{ public $name; public $surname; public static function set_name($name) { $this->name=$name; } public static function set_surname($surname) { $this->surname=$surname; } public static function get_name() { return $this->name; } public static function get_surname() { return $this->surname; } } $john = new person('male'); $john->set_name('John'); $john->set_surname('Williams'); echo $john->get_name().' '.$john->get_surname().'is a '.$john->get_gender(); ?>
Здесь есть две проблемы:
Вы определили свои методы как static
. Вы не должны этого делать, поскольку это не так, они зависят от вызова объекта, поскольку вы хотите использовать объекты нестатические свойства.
У вас есть опечатка в вашей функции конструктора. Правильное имя конструктора – __construct
, обратите внимание на два _
в начале.
В статической функции $this
не существует. Вы можете обратиться к самому классу с помощью self::
. Итак, вместо $this->surname
, используйте self::surname
. Как отмечено ниже, это изменит вашу ошибку на новую ошибку, так как требует, чтобы переменные также были объявлены статическими.
Конечно, вам действительно нужно выяснить, почему вы ставили эти функции. Должны ли они быть статическими?
Вы пытаетесь получить доступ к свойству $ this из статического метода. Вы не можете этого сделать, поскольку любой статический доступ можно получить без создания экземпляра класса, поэтому переменная $ this не имеет смысла, поскольку вы не находитесь в фактическом экземпляре класса.
Это ключевое слово относится к текущему объекту, с которым вы работаете, например, если вы должны сделать 5 экземпляров человека, каждый из которых будет ссылаться на этот конкретный экземпляр человека, и вы можете свободно изменять свойства каждого объекта.
Когда вы используете static, вы не имеете в виду ни один экземпляр, вы просто получаете доступ к статическим переменным и вызываете статические методы этого класса. Все эти переменные и методы являются «широкими». Это означает, что если вы измените статическое свойство в одном экземпляре класса, статическое свойство изменится во всех классах.
Другой способ представить это – принимать при вызове ключевое слово new, вы создаете новый экземпляр объекта. Каждый экземпляр будет иметь свою собственную копию всех свойств и методов, которые вы описываете в классе, EXCEPT для статических. Представьте себе, что при доступе к статическому методу или статическому свойству вы всегда обращаетесь к одному объекту.
Вот почему было бы бессмысленно получать доступ к $ this из статического контекста. Вы не имеете в виду какой-либо конкретный экземпляр, а только сам класс.
Надеюсь, я объяснил это достаточно хорошо, это очень важная концепция, чтобы понять ООП, и это дает некоторым людям массу проблем, чтобы понять концепцию.