PHP中new static() 和 new self()

PHP中new static和new self的区别介绍 当我们在ChildClass中调用create()方法时,它返回的是ChildClass的实例,而不是ParentClass的实例。这意味着,如果我们使用继承来创建一个子类,并且在子类中调用了new static,它将返回子类的实例,而不是父类的实的实例。无论我们在哪个类中调用create()方法,它都只会返回ParentClass的实例,因为new self只会返回当前调用类的实例。当我们使用new self关键字创建对象实例时,它会始终返回当前调用的类的实例,而不考虑是否存在继承关系。 阅读详情
class A 
{
    public static function get_self() 
    {
        return new self();
    }

    public static function get_static() 
    {
        return new static();
    }
}

class B extends A {}

echo get_class(B::get_self());  // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); //A
该功能从语言内部角度考虑被命名为“后期静态绑定”。“后期绑定”的意思是说,static::不再被解析为定义当前方法所在的类,而是在实际
运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。
后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息
class A {
    private function foo() {
        echo "success!\n";
    }
    public function test() {
        $this->foo();
        static::foo();
    }
}

class B extends A {
   /* foo() will be copied to B, hence its scope will still be A and
    * the call be successful */
}

class C extends A {
    private function foo() {
        /* original method is replaced; the scope of the new one is C */
    }
}

$b = new B();         //success
$b->test();              //success
$c = new C();         //success
$c->test();           //fails

后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。
也就是说:class B 中的信息,如果使用parent::foo()  父类中没有改方法,那么会把最外层的C作为调用的一个类
							     self::foo()  如果本类中没有,同样也是把最外层作为调用的类来使用的。也就是为什么最后输出  ACC

class A {
    public static function foo() {
        static::who();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    public static function who() {
        echo __CLASS__."\n";
    }
}

C::test();  //输出 A  C  C  不懂不懂!!
PHP面向对象中new self()与 new static()的区别浅析 new static()是在PHP5.3版本中引入的新特性,无论是new static()还是new self(),都是new了一个新的对象。下面这篇文章主要给大家介绍了关于PHP面向对象中new self()与 new static()的区别,需要的朋友可以参考借鉴,下面来一起看看吧。 立即下载

相关推荐

使用Xpath语法爬取豆瓣读书Top250

使用Xpath语法爬取豆瓣读书Top250 使用的软件是Spyder 网页地址:https://book.douban.com/top250?start=0 直接上代码: # -*- coding: utf-8 -*- """ Created on Thu Apr 30 18:35:17 2020 @author: ASUS """ import requests import csv fr...

weixin_43987253的博客 2081

php new static,PHP面向对象中new self()与new static()的区别是什么

PHP面向对象中new self()与new static()的区别是:new self()返回的实例是不变的,始终返回同一个类的实例;new static()返回的实例是由调用者决定的。new static()是在PHP5.3版本中引入的新特性。无论是new static()还是new self(),都是new了一个新的对象。这两个方法new出来的对象有什么区别呢?下面本篇文章给大家介绍一下。P...

weixin_28931737的博客 238

AIStarter避坑指南:Wan2.2 Animate整合包从下载到出片的完整流程(附常见错误修复)

本文提供了Wan2.2 Animate整合包从下载部署到生成高清视频的完整避坑指南。详细解析了通过AIStarter启动、环境配置、核心参数调优以及七大常见错误(如CUDA内存不足、节点缺失、视频模糊等)的根因与修复方案,帮助用户高效利用ComfyUI工作流,稳定生成720P高质量AI动画视频。

weixin_29052717的博客 703

php 中 new self() 和 new static()区别

并且这个方法在子类中被调用,那么它将创建子类的实例,而不是父类的实例。关键字引用的是当前类本身。无论在哪个类中调用它,它总是引用定义关键字的那个类。这意味着,如果你在父类的一个方法中使用。关键字则不同,它引用的是调用该方法的类。这意味着如果你在父类的方法中使用。都用于创建当前类的实例,但它们在运行时绑定和继承上下文中的行为有所不同。,那么即使在子类中调用这个方法,它仍然会创建父类的实例,而不是子类的实例。而在需要确保总是创建某个特定类的实例时,因此,在需要根据调用上下文动态确定实例类型的情况下,

qq_37638125的博客 854

在 Windows 上安装 OpenCV – C++ / Python

而且,安装并不是一件容易的事。这些安装程序仅适用于安装 OpenCV for C++。如果您想安装适用于 Python 的 OpenCV,您将在博客后面找到相关信息。在这篇博文中,我们将在 Windows 上安装适用于 C++ 和 Python 的 OpenCV。C++ 安装是在自定义安装 exe 文件的帮助下完成的。而Python的安装是通过Anaconda完成的。从源代码安装 OpenCV 需要花费大量时间。根据您的硬件和安装配置,该过程可能需要 5 分钟到 2 小时不等。

Demondai999的博客 2090

从零构建:openEuler WSL下的ARM交叉编译工具链自动化部署方案

本文详细介绍了在openEuler WSL环境下使用Ansible自动化部署ARM交叉编译工具链的方案。通过编写Ansible角色和Playbook,实现从基础环境配置到工具链安装、环境变量设置的一键部署,大幅提升嵌入式开发效率。方案支持多种ARM架构,并扩展了QEMU仿真、VS Code远程开发等实用功能,是嵌入式开发者的高效解决方案。

h3i4j的博客 382

php静态new对象,PHP中new static()与new self()的比较

今天在coding的时候,发现了 new static(),觉得实例化的地方不是应该是 new self()吗?查询了一下才知道两者的区别:1)在有子类集成的时候,两者的表现不一样2)php 5.2及以下的版本不支持 new static()的语法简单通俗的来说, self就是写在哪个类里面, 实际调用的就是这个类.所谓的后期静态绑定, static代表使用的这个类, 就是你在父类里写的stati...

weixin_42662171的博客 398

[捷稀 JCG Q30 Pro 刷机说明] 以刷入openwrt24.10为例

摘要: 本文详细介绍了捷稀JCG Q30 Pro路由器刷入OpenWrt 24.10系统的步骤。通过先刷入OpenWrt 23.05过渡固件,再升级Uboot,最后通过TFTP加载工厂镜像完成刷机。关键步骤包括解锁分区、刷写Uboot、进入恢复模式及配置网络。文章还提供了无线设置、Tailscale内网穿透等进阶命令,并附参考文档和固件下载链接。适用于有一定技术基础的玩家,需注意操作风险,严格按流程执行。

贤时间 7132

PHP中new self()和new static()的区别探究

1.new static()是在PHP5.3版本中引入的新特性。 2.无论是new static()还是new self(),都是new了一个新的对象。 3.这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢? 为了探究上面的问题,我们先上一段简单的代码: class Father { public function getN...

moliyiran的专栏 128

【WorkBuddy专栏】完结篇暨付费专栏总目录(内容继续更新中)

【WorkBuddy专栏】完结篇和付费内容总目录

AI人人懂 907

​非线性分析-增加位移量可能出现下面错误。虽然求解无法在所有时间点完成,但在某些点上仍能够求解部分结果。请参阅“帮助系统”中的故障排除,以了解更多信息详情。由于受约束,规划求解引擎无法收敛

基于收敛状态拆分载荷步‌:在已收敛的载荷步基础上,将未收敛的关键区域拆分为更细的子步,比如在载荷突变点前设置5~10个子步,逐步加载。替换冲突约束为弱约束‌:若存在约束冲突,将刚性约束替换为弱弹簧约束(刚度设为1e-6~1e-4),既限制刚体位移,又不影响结构的变形自由度,命令流:SPRING, NODE, K, 1e-6。部分区域约束完整,但存在未被约束的刚体自由度,或约束类型与大变形/接触逻辑冲突,比如某部件的位移约束在初始阶段有效,但大变形后约束位置脱离实际受力点,导致求解器在该阶段无法收敛。

qq_15963745的博客 144

php中newself(),PHP中new static() 和 new self() 的区别介绍

长夜漫漫啊!今天领导本地搭建一个站。发现用PHP 5.2 搭建不起来,站PHP代码里面有很多5.3以上的部分,领导让苦逼我更改在5.2下能运行。改着改着发现了一个地方复制代码 代码如下:return new static($val);这尼玛是神马,只见过复制代码 代码如下:return new self($val);于是上网查了下,他们两个的区别。self – 就是这个类,是代码段里面的这个类。s...

weixin_34249113的博客 125

23、微波电路中的过孔、过孔围栏与接地焊盘建模分析

本文详细分析了微波电路设计中过孔、过孔围栏及接地焊盘的建模与优化方法。探讨了过孔模型的发展及其电感与电容特性,通过场求解器和集总元件模型提高建模精度。此外,分析了过孔隔离围栏在改善信号隔离中的作用,并通过2.5D和3D电磁仿真验证其效果。最后,研究了接地焊盘中过孔布局对电路稳定性的影响,提出了优化过孔位置以消除谐振和杂散振荡的方法。文章为微波电路设计提供了重要的理论支持和实践指导。

convnet3designer的博客 164

PHP中new self()和new static()的区别

1.new static()是在PHP5.3版本中引入的新特性。 2.无论是new static()还是new self(),都是new了一个新的对象。 3.这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢? 为了探究上面的问题,我们先上一段简单的代码: class Father { public function getNewFather() { return new self(); } public funct

qq_27006679的博客 322

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

PHP中new self()和new static()的区别--延迟静态加载

1.new static()是在PHP5.3版本中引入的新特性。 2.无论是new static()还是new self(),都是new了一个新的对象。 3.这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢? 为了探究上面的问题,我们先上一段简单的代码:   class Father { public function get...

MCY的博客 310

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

php new static,PHP中new static() 和 new self() 的区别介绍

长夜漫漫啊!今天领导本地搭建一个站。发现用PHP 5.2 搭建不起来,站PHP代码里面有很多5.3以上的部分,领导让苦逼我更改在5.2下能运行。改着改着发现了一个地方return new static($val);这尼玛是神马,只见过return new self($val);于是上网查了下,他们两个的区别。self – 就是这个类,是代码段里面的这个类。static – PHP 5.3加进来的只...

weixin_39663605的博客 177

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

PHP new self什么,PHP中new self()和new static()有什么区别

本文主要和大家分享PHP中new self()和new static()有什么区别,希望能帮助到大家。1.new static()是在PHP5.3版本中引入的新特性。2.无论是new static()还是new self(),都是new了一个新的对象。3.这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢?为了探究上面的问题,我们先上一段简单的代码:...

weixin_39950764的博客 289

php new static,PHP中new self()和new static()的区别用法

浅谈PHP中new self()和new static()的区别本文介绍了PHP中new self()和new static()的区别,分享给大家,也给自己留个笔记。1.new static()是在PHP5.3版本中引入的新特性。2.无论是new static()还是new self(),都是new了一个新的对象。3.这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实...

weixin_33837884的博客 358

php 中new self()和new static()的区别

new static()是在PHP5.3版本中引入的新特性。 无论是new static()还是new self(),都是new了一个新的对象。 这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢? 为了探究上面的问题,我们先上一段简单的代码  class Father { public function getNewFather(...

qq_40393865的博客 216

php new static,浅谈PHP中new self()和new static()的区别

本文介绍了PHP中new self()和new static()的区别,分享给大家,也给自己留个笔记。1.new static()是在PHP5.3版本中引入的新特性。2.无论是new static()还是new self(),都是new了一个新的对象。3.这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢?为了探究上面的问题,我们先上一段简单的代码...

weixin_29186249的博客 389

PHP new self()和new static()的区别

PHP "new self()" "new static()"

xkdlzy的专栏 441

php return new self,php new self() 和 new static()的区别

1.new static()是在PHP5.3版本中引入的新特性。2.无论是new static()还是new self(),都是new了一个新的对象。3.这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢?为了探究上面的问题,我们先上一段简单的代码:public function getNewFather() {return new self();}...

weixin_39720662的博客 306

探究PHP中new self()和new static()的区别

1.new static()是在PHP5.3版本中引入的新特性。 2.无论是new static()还是new self(),都是new了一个新的对象。 3.这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢? 为了探究上面的问题,我们先上一段简单的代码: 1.new static()是在PHP5.3版本中引入的新特性。 2.无论是new static()还是new self(),都是new了一个新的对象。 3.这两个方法new出来的对象有什么区别呢,说白

echojson的专栏 258
上一篇: PHP 范围解析操作符,__call(),__callstatic()的使用
下一篇: composer 自动加载原理
o王o
博客等级 码龄13年 32粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值