资讯专栏INFORMATION COLUMN

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

missonce / 352人阅读

摘要:首先阐明结论,在中指向定义了当前被调用方法的类,指向调用当前静态方法的类。下面的例子更好的说明了和之间的差异后者使用了的后期静态绑定指向调用方法的当前类

首先阐明结论,在PHP中 self指向定义了当前被调用方法的类, static指向调用当前静态方法的类。

接下来通过一个例子来证明上面的结果

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

之所以会这样是因为使用self:: 或者__CLASS__对当前类的静态引用,取决于定义被调用方法所在的类,将上面Class A的方法echoProperty做一下修改变成:

class A 
{
    public static $_a = "Class A";

    public static function echoProperty()
    {
        echo static::$_a . PHP_EOL;
    }
}
//再次调用B::echoProperty将输出   "CLASS B"

为了避免上面第一个例子中看到的子类重写父类的静态属性后,使用继承来的方法仍然访问父类的静态属性, PHP5.3增加了一个新的语法:后期静态绑定(Late static binding), 使用static关键字替代self关键字,使得static指向与get_called_class()返回的相同的类,即当前调用静态方法的类, 该关键字对于静态方法的访问同样有效。

下面的例子更好的说明了new self()和new static()之间的差异(后者使用了PHP的后期静态绑定指向调用方法的当前类)

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

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

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

相关文章

  • php面向对象selfstatic区别

    摘要:在的面向对象编程中,总会遇到可你知道和的区别么其实区别很简单,只需要写几个就能懂得到输出可以发现,在子类中还是会调用父类的方法得到输出可以看到,在调用,子类哪怕调用的是父类的方法,但是父类方法中调用的方法还会是子类的方法好绕嘴。。 在php的面向对象编程中,总会遇到 class test{ public static function test(){ self::func(...

    microcosm1994 评论0 收藏0
  • SegmentFault 技术周刊 Vol.32 - 七夕将至,你对象”还好吗?

    摘要:很多情况下,通常一个人类,即创建了一个具体的对象。对象就是数据,对象本身不包含方法。类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型。在中,对象通过对类的实体化形成的对象。一类的对象抽取出来。注意中,对象一定是通过类的实例化来的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 马上就要到七夕了,离年底老妈老爸...

    李昌杰 评论0 收藏0
  • SegmentFault 技术周刊 Vol.32 - 七夕将至,你对象”还好吗?

    摘要:很多情况下,通常一个人类,即创建了一个具体的对象。对象就是数据,对象本身不包含方法。类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型。在中,对象通过对类的实体化形成的对象。一类的对象抽取出来。注意中,对象一定是通过类的实例化来的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 马上就要到七夕了,离年底老妈老爸...

    Lyux 评论0 收藏0
  • SegmentFault 技术周刊 Vol.32 - 七夕将至,你对象”还好吗?

    摘要:很多情况下,通常一个人类,即创建了一个具体的对象。对象就是数据,对象本身不包含方法。类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型。在中,对象通过对类的实体化形成的对象。一类的对象抽取出来。注意中,对象一定是通过类的实例化来的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 马上就要到七夕了,离年底老妈老爸...

    AaronYuan 评论0 收藏0
  • PHP设计模式

    摘要:设计模式理解设计模式是面向对象编程的经验总结和最佳实践解决某一类特定问题。设计模式分类创建型单例模式工厂模式简单工厂抽象工厂构建者模式原型模式结构型行为型观察者模式责任链模式单例模式单例模式一般使用在资源共享和需要控制资源的情况下。 面向对象与面向过程的区别 做事情的思考方式不同面向对象----分析再拆出对象面向过程----分析再拆出步骤 联系面向对象和面向过程都是一种编程思维,面向...

    mo0n1andin 评论0 收藏0

发表评论

0条评论

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