Are there any potential pitfalls or advantages to using self or __CLASS__ when instantiating objects in PHP classes?

Using self or __CLASS__ when instantiating objects in PHP classes can provide flexibility in terms of class inheritance and static binding. However, using self can lead to unexpected behavior when used in a parent class that is extended by a child class, as it will always refer to the parent class. On the other hand, using __CLASS__ will dynamically resolve to the class name of the child class when used in a parent class.

class ParentClass {
    public static function createInstance() {
        return new self(); // This will always create an instance of ParentClass
    }
}

class ChildClass extends ParentClass {
    public static function createInstance() {
        return new static(); // This will create an instance of ChildClass
    }
}