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

PHPself关键字的用法

时间:2023-03-29 19:24:19 PHP

PHP群里有人问self关键字的用法。答案很明显:静态成员函数中不能用this调用非成员函数,但是可以用self调用静态成员函数/变量/常量;其他成员函数可以使用self调用静态成员函数和非静态成员函数。随着讨论的深入,发现自我并没有那么简单。鉴于此,本文首先对几个关键字进行了比较和区分,然后总结了self的用法。与parent、static和this的区别如果你想充分了解self,就必须将它与parent、static和this区分开来。下面分别进行比较。parentself和parent的区别比较容易:parent是指父类/基类覆盖的方法(或变量),self是指自己的方法(或变量)。比如在构造函数中调用父类构造函数:staticstatic的一般目的是修饰函数或变量成为类函数和类变量,在函数中修饰变量使其生命周期延长到类的生命周期整个应用程序。但是它与self的关联是PHP5.3之后引入的新用途:静态延迟绑定。借助static的静态后期绑定功能,可以在运行时动态确定所属类。例如:在函数引用方面,self和static的区别是:对于静态成员函数,self指向代码的当前类,static指向调用类;对于非静态成员函数,self抑制多态性,指向当前类的成员函数,而static等价于此,动态指向调用类的函数。parent、self、static这三个关键字的组合还是挺有意思的,分别指向父类、当前类、子类,有点像“过去、现在、未来”。Thiself和this是讨论最多也最有可能导致误用的组合。两者的主要区别在于:静态成员函数中不能使用this,而self可以;对于静态成员函数/变量的访问,建议使用self而不是$this::或$this->;对于非静态成员变量访问,不能用self,只能用this;this应该在对象已经被实例化时使用,而self没有这样的限制;在非静态成员函数中使用时,self抑制多态行为并引用当前类的函数;this指的是调用类的覆盖函数(如果有的话)。self的使用看了上面三个关键字的区别,self的使用是不是立马就明白了呢?用一句话概括,就是:self总是指向“当前类(和类实例)”。详细来说就是:替换类名,引用当前类的静态成员变量和静态函数;抑制多态行为,引用当前类的函数而不是子类覆盖的实现;slot1,在这些关键字中,只有这个需要加$符号,而且是必须加的。强迫症就是说很不舒服;2、静态成员函数中,非静态成员函数不能通过$this->调用,但可以通过self::调用,调用函数中不使用$this->也能顺利运行。这种行为在不同的PHP版本中似乎有所不同,但在当前的7.3中是可以的;3.在静态函数和非静态函数中输出self,猜猜结果是什么?两者都是string(4)"self",这是一个令人困惑的输出;返回$thisinstanceofstatic::class;会有语法错误,但是下面两种写法是正常的: