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

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay