Я понимаю, что есть два способа доступа к классу PHP – «::» и «->». Иногда мне кажется, что работает, а другой нет, и я не понимаю, почему.
Каковы преимущества каждого из них и какова правильная ситуация для использования?
Проще говоря, ::
для свойств класса , а ->
для свойств уровня объекта.
Если свойство принадлежит классу, используйте ::
Если свойство принадлежит экземпляру класса , используйте ->
class Tester { public $foo; const BLAH; public static function bar(){} } $t = new Tester; $t->foo; Tester::bar(); Tester::BLAH;
Символ «::» предназначен для доступа к методам / свойствам объекта, который был объявлен с ключевым словом static, «->» предназначен для доступа к методам / свойствам объекта, которые представляют методы / свойства экземпляра.
Когда вы объявляете класс, он по умолчанию «статический». Вы можете получить доступ к любому методу в этом классе с помощью ::
оператора и в любой области. Это означает, что если я создам класс lib, я могу получить доступ к нему везде, где захочу, и он не должен быть глобальным:
class lib { static function foo() { echo "hi"; } } lib::foo(); // prints hi
Теперь, когда вы создаете экземпляр этого класса с помощью new
ключевого слова, вы используете ->
для доступа к методам и значениям, потому что вы ссылаетесь на этот конкретный экземпляр класса. Вы можете думать о ->
как inside of
. (Обратите внимание, вы должны удалить статическое ключевое слово) IE:
class lib { function foo() { echo "hi"; } } $class = new lib; $class->foo(); // I am accessing the foo() method INSIDE of the $class instance of lib.
Php может ввести в заблуждение в этом отношении, вы должны это прочитать.
То, что также сбивает с толку, заключается в том, что вы можете вызывать нестатические функции с символом ::. Это очень странно, когда вы приходите из Java. И это, конечно, удивило меня, когда я впервые увидел это.
Например:
class Car { public $name = "Herbie <br/>"; public function drive() { echo "driving <br/>"; } public static function gas() { echo "pedal to the metal<br/>"; } } Car::drive(); //will work Car::gas(); //will work $car = new Car(); $car->drive(); // will work $car->gas(); //will work echo $car->name; // will work echo Car::$name; // wont work error
Как вы видите, в php статический код очень свободен. И вы можете вызвать любую функцию с символами -> и :: ::. Но есть разница, когда вы вызываете с :: не существует $ этой ссылки на экземпляр. См. Пример № 1 в руководстве .
Следует также отметить, что каждая статическая функция также может быть вызвана с использованием экземпляра класса, но не наоборот.
Итак, это работает:
class Foo { public static function bar(){} } $f = new Foo(); $f->bar(); //works Foo::bar(); //works
И это не так:
class Foo { protected $test="fddf"; public function bar(){ echo $this->test; } } $f = new Foo(); $f->bar(); //works Foo::bar(); //fails because $this->test can't be accessed from a static call
Конечно, вы должны ограничить себя статическим методом статическим методом, потому что экземпляр экземпляра не только стоит памяти, но и не имеет большого смысла.
Это объяснение было главным образом для иллюстрации того, почему это сработало для вас некоторое время.
Sourcing WikiPedia – класс
В объектно-ориентированном программировании класс представляет собой конструкцию языка программирования, которая используется в качестве плана для создания объектов. В этом проекте описывается состояние и поведение, которые все совместно созданные объекты. Объект, созданный классом, является экземпляром класса, а класс, создавший этот экземпляр, можно рассматривать как тип этого объекта, например, тип объекта, созданного классом «Фрукт», будет «Плод».
Оператор ::
Доступ к классам и свойствам класса, которые определены в php, используя ключевое слово static
. Доступ к классу const
также осуществляется с помощью ::
Оператор ->
обращается к методам и свойствам экземпляра класса.
Если функция работает на экземпляре, вы будете использовать ->
. Если он работает с самим классом, вы будете использовать ::
Другое использование ::
было бы, если вы хотите вызвать свои parent
функции. Если один класс наследует другой – он может переопределять методы из родительского класса, а затем вызывать их с помощью parent::function()