PHP中new static() 和 new self() 的区别介绍
PHP中的new static()与new self():关键差异与解决方案
夜深人静,我在为领导搭建一个网站时遇到了PHP版本的问题。在PHP 5.2版本中,许多现代的代码片段无法运行,领导希望我能将其修改为能在旧版本下运行的代码。在这个过程中,我遇到了一个令我困惑的代码片段:`return new static($val);`。我只熟悉 `return new self($val);`这种形式。于是我开始研究这两者之间的区别。
self关键字指的是当前代码所在的类。当你在一个类的上下文中使用self时,你正在引用该类本身。而static关键字在PHP 5.3版本中引入的后期静态绑定中,它指向你调用方法的类。简单来说,self总是指向代码所在的类,而static则指向实例化类的类。这种差异在继承关系中尤其重要。
让我们通过一个例子来深入理解这个概念:
```php
class A {
public static function get_self() {
return new self(); // 创建A类的新对象
}
public static function get_static() {
return new static(); // 创建调用此方法的类的新对象
}
}
class B extends A {}
echo get_class(B::get_self()); // 输出 "A",因为不论B如何调用,self总是指向A类
echo get_class(B::get_static()); // 输出 "B",因为static指向调用方法的类,这里是B类
```
那么,如何解决使用 `return new static($val);`带来的问题呢?其实有一种简单的方法,就是利用 `get_class($this)` 来获取当前实例化的类的名称,然后动态地创建新的对象。如下所示:
```php
class A {
public function create1() {
$class = get_class($this); // 获取当前对象的类名
return new $class($val); // 根据类名创建新的对象
}
public function create2() {
return new static(); // 直接使用static创建当前类的实例
}
}
class B extends A {}
$b = new B(); // 创建B类的实例
var_dump($b->create1(), $b->create2()); // 输出结果应该是 "B",因为两种方法都会返回当前类的实例
```
这样我们就可以在不失去原有功能的情况下,兼容旧版本的PHP了。希望这个解释和解决方案能帮助你解决问题。如果还有疑问或者需要进一步的帮助,欢迎随时向我提问。
编程语言
- PHP中new static() 和 new self() 的区别介绍
- 基于react组件之间的参数传递(详解)
- HTML meat作用
- PHP使用mysql_fetch_object从查询结果中获取对象集的
- php常用Stream函数集介绍
- 史上最好用的远程桌面工具(附源码)
- PHP PDOStatement--fetchColumn讲解
- yii权限控制的方法(三种方法)
- 浅析Sql server锁,独占锁,共享锁,更新锁,乐观锁,悲
- Asp.net中时间格式化的6种方法详细总结
- sql server代理中作业执行SSIS包失败的解决办法
- Ajax发送和接收二进制字节流数据的方法
- 正则表达式(regex)或操作符”-“使用易出现功能
- Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
- 微信公众号开发之获取位置信息php代码
- 一个php生成16位随机数的代码(两种方法)