Я использовал код как это. Я не думаю, что существует действительно любая причина не использовать его, если ситуация гарантирует его.
Проще говоря, ::
для свойств уровня класса, а ->
для объекта- level properties.
Если свойство принадлежит классу, используйте ::
Если свойство принадлежит экземпляру класса , используйте ->
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
, вы используете ->
для доступа к методам и значениям, потому что вы ссылаетесь на этот конкретный экземпляр класса. Вы можете думать о ->
как о внутри
. (Обратите внимание, вы должны удалить ключевое слово static) 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.
Следует также отметить, что каждая статическая функция также может быть вызвана с использованием экземпляра класса, но не наоборот.
Итак, это работает:
class Foo
{
public static function bar(){}
}
$f = new Foo();
$f->bar(); //works
Foo::bar(); //works
И это не ' t:
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
Конечно, вы должны ограничиться вызовом статических методов статическим способом, потому что создание экземпляра не только требует затрат памяти, но и не имеет особого смысла.
Это объяснение было в основном для того, чтобы проиллюстрировать, почему это работает для иногда вы.
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 очень свободна. И вы можете вызывать любую функцию с помощью символов -> и ::. Но есть разница, когда вы вызываете с :: нет ссылки $ this на экземпляр. См. Пример №1 в руководстве .
Sourcing WikiPedia - Class
В объектно-ориентированном программировании класс - это язык программирования конструкция, которая используется в качестве чертежа создавать объекты. Этот план описывает состояние и поведение, которое все созданные объекты разделяют. An объект, созданный классом, является экземпляр класса, а класс создавший этот экземпляр может быть рассматривается как тип этого объекта, например, тип объекта, созданного Класс "Fruit" будет "Fruit".
Оператор ::
обращается к методам и свойствам класса, которые определены в php с помощью ключевого слова static
. Доступ к классу const
также осуществляется с помощью ::
Оператор ->
обращается к методам и свойствам экземпляра класса.
Если функция работает с Например, вы будете использовать ->
. Если он работает с самим классом, вы будете использовать ::
Другое использование ::
будет, когда вы захотите вызвать свои родительские
функции. Если один класс наследует другой - он может переопределять методы родительского класса, а затем вызывать их, используя parent :: function ()