Классы PHP: когда использовать :: vs. ->?

Я понимаю, что есть два способа доступа к классу 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()