前言 本文主要跟大家介绍了关于PHP面向对象中new self()与 new static()的区别,这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢?下面话不多说了,来一起看看详细的介绍吧。 区别如下: 首先阐明结论,在PHP中 self指向定义了当前被调用方法的类, static指向调用当前静态方法的类。 接下来通过一个例子来证明上面的结果 class A { public static $_a = 'Class A'; public static function echoProperty() { echo self::$_a 在PHP的面向对象编程中,`new self()` 和 `new static()` 是两个常见的构造语法,它们在创建对象时的行为有所不同,特别是在涉及到继承和静态方法时。理解这两个关键字的区别是编写可扩展和灵活代码的关键。 `self` 关键字在PHP中用于引用当前类,它总是指向定义当前被调用方法的类。这意味着,无论在哪种情况下,`self::` 都会指向静态方法或属性被声明的那个类。例如: ```php class A { public static $_a = 'Class A'; public static function echoProperty() { echo self::$_a . PHP_EOL; } } class B extends A { public static $_a = 'Class B'; } $obj = new B(); B::echoProperty(); // 输出 'Class A' ``` 在这个例子中,`B` 类继承了 `A` 类,并重写了 `$_a` 静态属性,但 `B::echoProperty()` 仍然输出 'Class A',因为 `self::$_a` 指向的是 `A` 类中的 `$_a`。 然而,PHP 5.3 引入了后期静态绑定(Late Static Binding, LSB),这使得 `static` 关键字可以动态地指向调用静态方法的类,即当前上下文中的类。这意味着,`static::` 总是指向调用它的那个类,即使它是在父类中定义的。例如: ```php class A { public static $_a = 'Class A'; public static function echoProperty() { echo static::$_a . PHP_EOL; } } class B extends A { public static $_a = 'Class B'; } $obj = new B(); B::echoProperty(); // 输出 'Class B' ``` 在这个例子中,`static::$_a` 在 `B::echoProperty()` 中指向 `B` 类的 `$_a`,从而输出 'Class B'。 进一步讨论 `new self()` 和 `new static()`,两者都在实例化对象,但有关键的不同: 1. `new self()` 总是创建当前类(也就是定义方法的类)的新实例。无论在哪里调用,`self` 永远指向原始定义它的类。因此,`A::get_self()` 和 `B::get_self()` 都会返回 `A` 类的新实例。 ```php class A { public static function get_self() { return new self(); } } class B extends A {} echo get_class(B::get_self()); // 输出 'A' ``` 2. 而 `new static()` 使用后期静态绑定,它根据调用的类创建新实例。这意味着,如果在子类中调用 `get_static()`,它会返回子类的新实例;而在父类中调用,返回父类实例。 ```php class A { public static function get_static() { return new static(); } } class B extends A {} echo get_class(B::get_static()); // 输出 'B' echo get_class(A::get_static()); // 输出 'A' ``` 总结来说,`new self()` 创建的是定义方法的类的实例,而 `new static()` 根据调用它的类创建实例。在编写可扩展的代码时,`new static()` 允许子类覆盖父类的实例化行为,提供更大的灵活性。理解这些细微差别对于编写面向对象的PHP代码至关重要,尤其是在设计模式和框架中,如工厂模式、单例模式等。
- 粉丝: 4
- 资源: 922
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助