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

发现了什么?

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向对象编程,__new__和__init__都是用于创建类实例的方法,但它们的作用不同。 __new__方法是用于创建实例并返回它的实例对象的方法。它是类级别的方法,即它是在类级别上定义的,而不是在实例级别上定义的。__new__方法的第一个参数是类本身,其余参数是传递给类构造函数的参数。__new__方法的返回值通常是一个新的实例对象,但也可以返回一个已经存在的实例对象。 __init__方法是用于初始化实例的方法。它是实例级别的方法,即它是在实例级别上定义的。__init__方法的第一个参数是self,它指向正在初始化的实例对象。其余参数是传递给类构造函数的参数。__init__方法通常不返回任何值,它只是初始化实例的状态。 因此,__new__方法是用于创建实例对象的,而__init__方法是用于初始化实例对象的。__new__方法返回一个新的实例对象,而__init__方法对该实例对象进行初始化。 下面是一个简单的例子,演示了__new__和__init__方法的区别: ```python class MyClass: def __new__(cls, *args, **kwargs): print("__new__ method is called") instance = super().__new__(cls) return instance def __init__(self, *args, **kwargs): print("__init__ method is called") self.name = args[0] self.age = args[1] my_obj = MyClass("Tom", 25) print(my_obj.name) print(my_obj.age) ``` 输出结果为: ``` __new__ method is called __init__ method is called Tom 25 ``` 在这个例子,__new__方法被调用来创建实例对象,然后__init__方法被调用来初始化该实例对象的状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值