当前位置: 首页 > 后端技术 > PHP

PHP的self关键字

时间:2023-03-29 16:36:20 PHP

转载请注明文章出处:https://tlanyan.me/self-in-php/PHP群里有人问self关键字的用法,答案很明显:静态成员function不能用this调用非成员函数,但是可以用self调用静态成员函数/变量/常量;其他成员函数可以使用self调用静态成员函数和非静态成员函数。随着讨论的深入,发现自我并没有那么简单。鉴于此,本文首先对几个关键字进行了比较和区分,然后总结了self的用法。与parent、static和this的区别如果你想充分了解self,就必须将它与parent、static和this区分开来。下面分别进行比较。parentself和parent的区别比较容易:parent是指父类/基类覆盖的方法(或变量),self是指自己的方法(或变量)。例如在构造函数中调用父类构造函数:classBase{publicfunction__construct(){echo"Baseconstructor!",PHP_EOL;}}classChild{publicfunction__construct(){parent::__construct();echo"子构造器!",PHP_EOL;}}newChild;//Output://Basecontructor!//Childcontructor!static常见的用途是修饰函数或变量,使其成为类函数和类变量,在函数内修饰变量,延长其生命周期至整个应用程序的生命周期。但是它与self的关联是PHP5.3之后引入的新用途:静态延迟绑定。借助static的静态后期绑定功能,可以在运行时动态确定所属类。例如:classBase{publicfunction__construct(){echo"Baseconstructor!",PHP_EOL;}publicstaticfunctiongetSelf(){returnnewself();}publicstaticfunctiongetInstance(){returnnewstatic();}publicfunctionselfFoo(){returnself::foo();}publicfunctionstaticFoo(){returnstatic::foo();}publicfunctionthisFoo(){return$this->foo();}publicfunctionfoo(){echo"BaseFoo!",PHP_EOL;}}classChildextendsBase{publicfunction__construct(){echo"Childconstructor!",PHP_EOL;}publicfunctionfoo(){echo"ChildFoo!",PHP_EOL;$base=Child::getSelf();$child=Child::getInstance();$child->selfFoo();$child->staticFoo();$child->thisFoo();程序的输出如下:Baseconstructor!Childconstructor!BaseFoo!ChildFoo!ChildFoo!在函数引用方面,self和static的区别是:对于静态成员函数,self指向代码的当前类,static指向调用类;对于非静态成员函数,self抑制多态性,指向当前类的成员函数Number,static相当于this,动态指向调用类的函数parent、self、static。三个关键字的组合还是挺有意思的,分别指向父类、当前类、子类,有点像“过去、现在、未来”。Thiself和this是讨论最多也最有可能导致误用的组合。两者的主要区别在于:静态成员函数中不能使用this,而self可以;对于静态成员函数/变量的访问,建议使用self而不是$this::或$this->;对于非静态成员变量访问,不能用self,只能用this;this应该在对象已经被实例化时使用,而self没有这样的限制;在非静态成员函数中使用时,self抑制多态行为并引用当前类的函数;this指的是调用类的覆盖函数(如果有的话)。self的使用看了上面三个关键字的区别,self的使用是不是立马就明白了呢?用一句话概括,就是:self总是指向“当前类(和类实例)”。详细:替换类名,引用当前类的静态成员变量和静态函数;抑制多态行为,引用当前类的函数而不是子类中重写的实现;slot的关键字中,只有这个是需要加$号的,而且是必须加的。强迫症就是说很不舒服;静态成员函数不能通过$this->调用非静态成员函数,但是可以通过self::调用,而且在调用函数中没有使用$this->仍然运行流畅。这种行为在不同的PHP版本中似乎有所不同,但在当前的7.3中是可以的;在静态函数和非静态函数中输出self,猜猜结果是什么?两者都是string(4)"self",这是一个令人困惑的输出;返回$thisinstanceofstatic::class;会有语法错误,但是下面两种写法是正常的:$class=static::class;return$thisinstanceof$class;//或者这样:return$thisinstanceofstatic;那么这是为什么呢?!请参阅何时在$this上使用self?