资讯专栏INFORMATION COLUMN

PHP new static 和 new self

Cristalven / 2308人阅读

摘要:则上面的基础上,更聪明一点点会返回执行的类,比如执行返回的是执行返回的是而在没有继承的情况下,可以认为和是返回相同的结果。

最近在一个视频的评论被问到一个小问题:这里选择用static 而不是self有特殊的考虑么?或者我们可以这样转换一下问题:

PHP 的 new static 和 new self 具体有什么?

视频地址 https://www.codecasts.com/ser...

其实这个来看一个例子应该就很清晰了:

class Father {

    public static function getSelf() {
        return new self();
    }

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

class Son extends Father {}

echo get_class(Son::getSelf()); // Father
echo get_class(Son::getStatic()); // Son
echo get_class(Father::getSelf()); // Father
echo get_class(Father::getStatic()); // Father

这里面注意这一行 get_class(Son::getStatic()); 返回的是 Son 这个 class,可以总结如下:

new self

1.self 返回的是 new self 中关键字 new 所在的类中,比如这里例子的 :

public static function getSelf() {
        return new self(); // new 关键字在 Father 这里
    }

始终返回 Father

new static

2.static 则上面的基础上,更聪明一点点:static 会返回执行 new static() 的类,比如 Son 执行 get_class(Son::getStatic()) 返回的是 Son, Father 执行 get_class(Father::getStatic()) 返回的是 Father

而在没有继承的情况下,可以认为 new selfnew static是返回相同的结果。

Tips: 可以用一个好的 IDE 来直接看注释。比如 PhpStorm:

Happy Hacking

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22389.html

相关文章

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

    摘要:首先阐明结论,在中指向定义了当前被调用方法的类,指向调用当前静态方法的类。下面的例子更好的说明了和之间的差异后者使用了的后期静态绑定指向调用方法的当前类 首先阐明结论,在PHP中 self指向定义了当前被调用方法的类, static指向调用当前静态方法的类。 接下来通过一个例子来证明上面的结果 class A { public static $_a = Class A; ...

    missonce 评论0 收藏0
  • PHPself关键字

    摘要:有了的静态延迟绑定功能,可以在运行时动态确定归属的类。与是被讨论最多,也是最容易引起误用的组合。的用途看完与上述三个关键字的区别,的用途是不是呼之即出一句话总结,那就是总是指向当前类及类实例。 转载请注明文章出处:https://tlanyan.me/self-in-php/ PHP群里有人询问self关键字的用法,答案是比较明显的:静态成员函数内不能用this调用非成员函数,但可以用...

    morgan 评论0 收藏0
  • php 设计模式之工厂模式、单例模式、注册树模式

    摘要:的设计模式有很多种,本文取最简单的三种模式工厂模式单例模式和注册树模式进行简单的讲解。文件创建完后,咱们回到单元测试文件文件再执行一下单元测试命令发现,也能返回成功,这样的话我们就能很方便的修改任何驱动了。 php 设计模式之工厂模式、单例模式、注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具...

    liangzai_cool 评论0 收藏0
  • PHP静态方法属性、延迟静态绑定

    摘要:静态方法和属性静态方法是以类作为作用域的函数。静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性。因此静态方法和属性又被称为类变量和属性,也就不能在静态方法中使用伪变量。引入了延迟静态绑定的概念。 静态方法和属性 静态方法是以类作为作用域的函数。静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性。如果修改了一个静态属性,那么这...

    rubyshen 评论0 收藏0
  • php.类与对象

    摘要:接口可以使用常量,叫接口常量,和类的常量使用方法相同类可以同时继承多个接口使用接口常量抽象类不能被实例化。继承抽象类,子类必须实现父类中所有的抽象方法。 访问控制 属性和方法的访问控制(可见标识):public 任何地方private 类自身protected 类自身,自子类及自父类 this this 可以理解为这个类的一个实例 self self 代表类本身 __construc...

    scq000 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<