PHP面向对象中new self( )和 new static( ) 的区别

1. Introduction

PHP is a popular programming language used for web development. It supports object-oriented programming (OOP) features that allow developers to write clean and modular code. In PHP, the new keyword is used to create new instances of a class. However, PHP provides two different ways to use the new keyword: new self() and new static(). In this article, we will explore the differences between these two approaches and discuss when to use each one.

2. Understanding the Basics

2.1 The self Keyword

The self keyword in PHP refers to the class in which it is used. When we use new self(), we are creating a new instance of the same class where the new self() statement is written. This means that even if the code is inherited by a subclass, the instance created will always be an object of the class where new self() is written.

class ParentClass {

public function createInstance() {

return new self();

}

}

class ChildClass extends ParentClass {

}

$obj = new ChildClass();

$instance = $obj->createInstance();

echo get_class($instance); // Output: ParentClass

In the above example, we have a parent class ParentClass which has a method createInstance(). This method uses new self() to create a new instance of the same class. Even though the createInstance() method is called on an instance of ChildClass, the resulting instance is still of the ParentClass.

2.2 The static Keyword

The static keyword in PHP behaves differently from the self keyword. When we use new static(), PHP determines the class in which the new static() statement is used, rather than the class where it is written. This means that if the code is inherited by a subclass and the new static() statement is used, the instance created will be of the subclass, not the parent class.

class ParentClass {

public function createInstance() {

return new static();

}

}

class ChildClass extends ParentClass {

}

$obj = new ChildClass();

$instance = $obj->createInstance();

echo get_class($instance); // Output: ChildClass

In the above example, the createInstance() method uses new static() to create a new instance of the class. When the method is called on an instance of ChildClass, the resulting instance is also of the ChildClass.

3. Key Differences

Now, let's summarize the key differences between new self() and new static():

1. Inheritance: When using new self(), the instance created will always be of the same class where the new self() statement is written. On the other hand, when using new static(), the instance created will be determined by the class where the new static() statement is used, even if it is inherited by a subclass.

2. Polymorphism: In the case of new self(), polymorphism is not achieved since the instance is always of the same class. However, when using new static(), polymorphism is achieved since the instance can be of the subclass if the method is called on an instance of the subclass.

3. Flexibility: new static() provides more flexibility compared to new self() as it allows for dynamic method resolution based on the runtime class, rather than the class where it is written.

4. When to Use each Approach

4.1 new self()

new self() is useful in scenarios where you want to ensure that the instance created is always of the same class where the new self() statement is written, regardless of any subclasses that may inherit the code. This can be helpful when working with factory methods or implementing design patterns like the Singleton pattern.

4.2 new static()

new static() is useful in scenarios where you want to achieve polymorphism and have the instance created be determined by the runtime class instead of the class where the new static() statement is written. This allows for more flexibility in the code and allows subclasses to create instances of themselves.

5. Conclusion

In conclusion, the new self() and new static() approaches in PHP provide different behaviors when creating instances of classes. The new self() statement always creates an instance of the same class, while the new static() statement creates an instance based on the runtime class. Understanding the differences between these two approaches is crucial for writing efficient and maintainable object-oriented code in PHP.

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签