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

实践出真知,先动手测试一下。测试demo:

<?php
class A{
    public function getSelf()
    {
        return new self();
    }

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

    public function getThis()
    {
        return $this;
    }
}

class B extends A {

}

print(get_class((new A())->getSelf())); // A
print(get_class((new A())->getStatic())); // A
print(get_class((new A())->getThis())); // A

echo PHP_EOL;

print(get_class((new B())->getSelf())); // A
print(get_class((new B())->getStatic())); // B
print(get_class((new B())->getThis())); // B

上边的例子可以看出,如果没有子类继承,他们返回的都是当前类的实例的本身
如果存在了子类继承,那么new self()返回的是父类的实例。new static()仍然返回当前类的实例。

我们把代码做个调整,引入中间类C:

<?php
class A{
    public function getSelf()
    {
        return new self();
    }

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

    public function getThis()
    {
        return $this;
    }
}

class C extends A{

}
class B extends C {

}

print(get_class((new A())->getSelf())); // A
print(get_class((new A())->getStatic())); // A
print(get_class((new A())->getThis())); // A

echo PHP_EOL;

print(get_class((new C())->getSelf())); // A
print(get_class((new C())->getStatic())); // C
print(get_class((new C())->getThis())); // C

echo PHP_EOL;

print(get_class((new B())->getSelf())); // A
print(get_class((new B())->getStatic())); // B
print(get_class((new B())->getThis())); // B

发现了什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值