DEV Community

Cover image for The Guide Of Using :: and -> for Accesing Methods Properly
Ahmedraza Fyntune
Ahmedraza Fyntune

Posted on

The Guide Of Using :: and -> for Accesing Methods Properly

In PHP, :: is the Paamayim Nekudotayim (Hebrew for "double dots") operator, commonly referred to as the scope resolution operator. It serves several purposes related to classes and their members:

  1. Accessing Static Members:
    • It's used to access static properties and methods of a class. Static members belong to the class itself, not to specific instances (objects) of the class.
class MyClass {
    public static $myStaticProperty = "Hello";

    public static function myStaticMethod() {
        echo "World";
    }
}

echo MyClass::$myStaticProperty; // Output: Hello
MyClass::myStaticMethod();       // Output: World

2. Accessing Constants:
 * It's used to access class constants, which are values that cannot be changed after they are defined.
class MyClass {
    const MY_CONSTANT = 123;
}

echo MyClass::MY_CONSTANT; // Output: 123
Enter fullscreen mode Exit fullscreen mode
  1. Calling Parent Class Methods:
    • Within a class that inherits from another class (parent class), :: can be used with parent to call methods of the parent class. This is often used to extend or override parent class behavior.
class ParentClass {
    public function myMethod() {
        echo "Parent";
    }
}

class ChildClass extends ParentClass {
    public function myMethod() {
        parent::myMethod(); // Call the parent's myMethod()
        echo "Child";
    }
}

$child = new ChildClass();
$child->myMethod(); // Output: ParentChild
Enter fullscreen mode Exit fullscreen mode
  1. Accessing Overridden Methods:
    • Similarly, :: can be used with self to call the current class's method, even if it has been overridden in a child class.
class ParentClass {
    public function myMethod() {
        echo "Parent";
    }
}

class ChildClass extends ParentClass {
    public function myMethod() {
        echo "Child";
    }

    public function callParentMethod() {
        self::myMethod(); // Call the ChildClass's myMethod()
    }
}

$child = new ChildClass();
$child->callParentMethod(); // Output: Child
Enter fullscreen mode Exit fullscreen mode

Key Differences from ->:

  • :: is used for static members, constants, and accessing parent/self methods.
  • -> (object operator) is used to access instance members (properties and methods) of an object. In summary, :: is a crucial operator in PHP for working with classes, providing access to static members, constants, and enabling inheritance-related functionalities.

difference between :: and -> for accessing methods

The core difference between :: and -> in PHP when accessing methods boils down to this:

  • :: (Scope Resolution Operator): Used for static methods and for accessing methods within the context of a class itself (e.g., calling parent methods).
  • -> (Object Operator): Used for instance methods, meaning methods that operate on a specific object of a class. Here's a breakdown to clarify:
    1. Static Methods (::)
  • Static methods belong to the class itself, not to any specific object created from the class.
  • They are called using the class name followed by :: and the method name.
  • Static methods cannot directly access instance properties (non-static properties) of the class.
class MathUtils {
    public static function add($a, $b) {
        return $a + $b;
    }
}

$sum = MathUtils::add(5, 3); // Calling a static method
echo $sum; // Output: 8
Enter fullscreen mode Exit fullscreen mode
  1. Instance Methods (->)
    • Instance methods operate on specific objects of a class.
    • They are called using an object of the class, followed by -> and the method name.
    • Instance methods can access both instance properties and static properties of the class.
class Dog {
    public $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function bark() {
        echo "Woof! My name is " . $this->name;
    }
}

$myDog = new Dog("Buddy"); // Creating an object
$myDog->bark(); // Calling an instance method
// Output: Woof! My name is Buddy
Enter fullscreen mode Exit fullscreen mode
  1. Calling Parent Methods (::)
    • Within a child class that inherits from a parent class, you use :: with parent to call a method of the parent class. This is essential for extending or overriding parent class behavior.
class Animal {
    public function makeSound() {
        echo "Generic animal sound";
    }
}

class Cat extends Animal {
    public function makeSound() {
        parent::makeSound(); // Call the parent's makeSound()
        echo ", Meow!";
    }
}

$myCat = new Cat();
$myCat->makeSound();
// Output: Generic animal sound, Meow!
Enter fullscreen mode Exit fullscreen mode

In summary:

  • If you're calling a method that is associated with the class itself (static) or need to access a parent class's method, use ::.
  • If you're calling a method that operates on a specific object of a class, use ->. This distinction is fundamental to object-oriented programming in PHP and helps maintain proper encapsulation and code organization.

In PHP, it's technically possible to call a static method using the object operator ->, even though the scope resolution operator :: is the conventional and recommended way.
Here's an example to illustrate this:

class MyClass {
    public static function myStaticMethod() {
        echo "This is a static method.";
    }
}

$obj = new MyClass();
$obj->myStaticMethod(); // Calling static method with ->
// Output: This is a static method.
Enter fullscreen mode Exit fullscreen mode

Why does this work?
PHP allows this for backward compatibility and due to its dynamic nature. When you use -> on an object, PHP first checks if the method is an instance method. If it's not found, it then checks if it's a static method of the class.
However, this is generally considered bad practice.
Here's why:

  • Clarity and Readability: Using :: clearly indicates that you're calling a static method, making your code easier to understand and maintain. Using -> for a static method can be confusing for other developers (and even for yourself later on).
  • Intent: Static methods are designed to be associated with the class itself, not with specific objects. Using :: reinforces this intent.
  • Potential for Confusion: If you later change the static method to an instance method, code that uses -> will still work, but the behavior might not be what you expect. Strict Standards Notice: In some PHP versions and with certain error reporting levels, calling a static method with -> might generate an E_STRICT notice. This is a warning that indicates you're using a feature in a way that is not recommended. In summary: While PHP allows you to call static methods with ->, it's strongly advised to use :: for static methods to maintain code clarity, express the correct intent, and avoid potential confusion or warnings. Stick to the convention:
  • :: for static methods and class constants
  • -> for instance methods and properties

Top comments (0)