当前位置: 首页 > 科技观察

PHP程序员:过来,告诉我$this、self、static有什么区别?

时间:2023-03-14 18:26:15 科技观察

简介我们每天都在敲代码,面对各种类和继承。面向对象的编程设计方式,倒逼着PHP程序员加入OOP大军。但是历史包袱太重,导致对PHP的函数工具库的印象,如此深刻。但是随着ZendSymfonyLaravel等框架的出现,大量的人参与开发,设计模式非常巧妙,让很多优秀的开发者将精力投入到PHP的OOP上。那么问题来了,你写了那么多PHP代码,你知道self和$this的区别吗?本文就简单说一下。学习时间简单来说,$this指向当前对象实例,self指向当前类。换句话说:$this->member调用非静态属性/方法,self::number调用静态属性/方法。举个例子,比较直观,说概念总是那么无聊。上面的示例清楚地使用了在构造函数中调用的静态属性和动态属性。实例化时执行。如果反着使用就会出错,比如using:self::$non_static_member.''.$this->static_member;self调用非静态属性,$this调用静态属性,是错误的用法。下面通过$this对象属性/方法调用的重载函数方法来演示类的多态性:上述文件执行后,返回值为Y::foo()。$this作为实例化的Y对象,直接访问其动态方法foo()。继承的X类的foo()方法被重写并且不执行。现在改变措辞。这次我们使用self::foo()调用类X的bar方法。那么很明显,self就是类X本身,那么自然就调用了X的foo方法。上面的程序输出X::foo()。扩展:尽量不要用self::,用static::self简单好用,但是scope烦人。因为它的范围是在定义时,而不是在执行时。例如,如果您调用Person::status(),它会返回“Personisalive”。现在新建一个类,继承它:ExecuteDeceased::status(),你期望得到什么,一定是Decased类的getStatus()返回的值吧?但结果返回Person::status()的值。这是因为在调用状态方法时,self::getStatus()用于访问Person类的getStatus()方法。这是由self作用域决定的。如何返回预期值?使用静态而不是自我。还是一样的规则:$this指的是当前类的实例,static指的是当前类本身。我们从好的代码中学习用法。下面是LaravelValidationData类中的一个静态方法。写在最后这篇文章通过几个简单的栗子来说明$thisselfstatic和作用域的细微差别。希望大家在设计类的时候慎重选择。