Различные способы доступа к методам
Я видел, что есть два разных способа доступа к методам в классе. Есть ли различия в поведении, или это чисто альтернативные синтаксисы для одного и того же действия?
$a = new A();
$a->foo();
A::foo();
5 ответов
Вы не можете просто использовать один или другой. ::
для статических методов и переменных, тогда как ->
например методы и переменные. Это "вдохновлено" из синтаксиса C++.
class A {
public function __construct() {}
public function foo() {}
}
$a = new A();
$a->foo();
// Or use the shorter "new A()->foo()";
// It won't return typeof(A), it will return what foo() returns.
// The object will still be created, but the GC should delete the object
или же
class A {
public static function foo() {}
}
A::foo();
По словам DCoder, ::
может использоваться для вызова родительских методов, но я точно не знаю этого.
class B {
public function __construct() {}
public function foo() {}
}
class A extends B {
public function __construct() {
// Code
parent::__construct()
}
public function foo() {
// Code
parent::foo()
}
}
Когда вы делаете
$a = new A();
У вас есть экземпляр класса объекта с именем A.
Это подразумевает, что у вас есть конкретный объект (со своей личностью, конкретными ценностями в его атрибутах).
Таким образом, вы можете получить доступ к свойствам и вызвать методы для этого объекта с помощью выражений, таких как:
$a->foo();
С другой стороны,
A::foo();
это правильный способ доступа к свойствам и методам, которые находятся в самом классе (в определении класса). Они называются статическими.
Основное отличие состоит в том, что к статическим методам можно получить доступ до создания любого объекта этого класса, то есть нет необходимости использовать new
оператор. Они используются для кросс-объектных атрибутов и общеобъектных методов.
Экземпляры объекта (созданные с new
оператор) являются реальными копиями класса, которые могут иметь различные значения для своих атрибутов. Два объекта одного класса могут иметь разные значения внутри одинаковых свойств. В статической части класса все объекты будут иметь одинаковые значения и поведение.
Надеюсь, что это помогло!
->
получит доступ к методу определенного объекта, который был создан из класса А.
::
является оператором разрешения области видимости, который ссылается на статические члены указанного класса (в вашем случае класс A).
Если вы не заметили с ->
вы получаете доступ к методу объекта $a
который был создан из класса А ($a = new A();
), но с ::
Вы получаете доступ к статическим методам (статические методы не нуждаются в доступе к объектам).
Например.
Предположим, у вас есть класс с именем Math
который имеет статический метод Add()
:
<?php
class Math{
// Note the 'static' keyword
public static function Add($arg1, $arg2){
return $arg1+$arg2;
}
}
?>
В этом случае вы можете использовать Add()
метод сразу без необходимости создания какого-либо объекта класса Math
вот так:
<?php
print Math::Add(2, 3);
?>
Вы используете ::
символ для доступа к статическому методу Math
учебный класс. Не имеет смысла использовать ->
символ, потому что он используется для доступа к методам объектов, которые были созданы из классов.
Так:
<?php
class Math{
// Add() NO LONGER static
public function Add($arg1, $arg2){
return $arg1+$arg2;
}
}
?>
И вы должны сделать это вместо этого:
<?php
$object = new Math();
$result = $object->Add(2, 3);
print $result;
?>
Использование оператора :: статически обращается к классу. В этом случае не существует экземпляра класса как объекта. Он используется в различных шаблонах проектирования ООП, таких как методы Singleton и Factory. Доступ к нему почти глобален и может привести к неприятностям, если вы не знаете, что делаете.
Использование оператора -> означает, что вы обращаетесь к методу или переменной экземпляра класса. В этом случае область действия находится внутри конкретного объекта, который вы создали, и удаляет это глобальное состояние.
Вы получите доступ foo()
метод с class::foo()
если foo()
это статический метод. В противном случае вы будете использовать object->foo()
например методы.