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

PHP的self关键字详解

时间:2023-03-29 17:35:04 PHP

PHP群里有人问self关键字的用法。答案很明显:静态成员函数中不能用this调用非成员函数,但是可以用self调用静态成员函数/变量/常量;其他成员函数可以使用self调用静态成员函数和非静态成员函数。随着讨论的深入,发现自我并没有那么简单。鉴于此,本文首先对几个关键字进行了比较和区分,然后总结了self的用法。与parent、static和this的区别如果你想充分了解self,就必须将它与parent、static和this区分开来。比较一下parentself和parent的区别如下:parent指的是父类/基类覆盖的方法(或变量),self指的是自己的方法(或变量)。点击进入,免费领取PHP学习资料。比如在构造函数中调用父类构造函数:`class``Base{``public``function``__construct(){``echo``"Baseconstructor!"``,PHP_EOL;``}``}``class``Child{``public``function``__construct(){``parent::__construct();``echo``"Childconstructor!"``,PHP_EOL;``}``}``new``Child;``//Output:``//Basecontructor!``//Childcontructor!`staticstatic的常见用法是修饰函数或变量,使它们成为类函数和类变量,也可以修改函数中的变量,将其生命周期延长到整个应用程序的生命周期。但是它与self的关联是PHP5.3之后引入的新用途:静态延迟绑定。借助static的静态后期绑定功能,可以在运行时动态确定所属类。例如:`class``Base{``public``function``__construct(){``echo``"Baseconstructor!"``,PHP_EOL;``}``public``static``function``getSelf(){``return``new``self();``}``public``static``function``getInstance(){``return``new``static``();````public``function``selfFoo(){``return``self::foo();``}``public``function``staticFoo(){``return``static``::foo();``}``public``function``thisFoo(){``return``$this``->foo();``}``public``function``foo(){``echo```"BaseFoo!"``,PHP_EOL;``}``}``class``Child``extends``Base{``public``function``__construct(){``echo``"子构造函数!"``,PHP_EOL;``}``public``function``foo(){``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抑制多态性,指向当前类的成员函数,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``$``this``instanceof``$class;``//或者this:``return``$``this``instanceof``static;`那么这是为什么呢?!`$class=static::class;``return``$``this``instanceof``$class;``//orthis:``return``$``this``instanceof``static;`