Различные способы доступа к методам

Я видел, что есть два разных способа доступа к методам в классе. Есть ли различия в поведении, или это чисто альтернативные синтаксисы для одного и того же действия?

$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() например методы.

Другие вопросы по тегам