福哥在阅读一些“老外”写的PHP代码的时候创造了一些比较奇怪的语法,他们会利用self或static作为new关键字的工具名称,这个到底是什么意思啊??
2. self()self字面意思是“自己”,那么是不是self()便是只代码所在的工具自己呢?
2.1 普通工具

2.1.1 代码
classTFUser{publicfunction__construct(bool$fromCallByFunc=false){if($fromCallByFunc){echo"福哥创建了".get_class($this)."的实例<br/>";}}publicfunctioncall_by_self(){returnnewself(true);}}classmyUserextendsTFUser{}$myUser=newmyUser();$myUser->call_by_self();
2.1.2 效果
可以看到普通工具里面self指向的是方法所属工具本身,本例中便是TFUser这个工具。
2.2 继续工具
2.2.1 代码
classTFUser{publicfunction__construct(bool$fromCallByFunc=false){if($fromCallByFunc){echo"福哥创建了".get_class($this)."的实例<br/>";}}}classmyUserextendsTFUser{publicfunctioncall_by_self(){returnnewself(true);}}$myUser=newmyUser();$myUser->call_by_self();
2.2.2 效果
可以看到继续工具里面self指向的也是方法所属工具本身,本例中便是myUser这个工具。
3. static()static字面意思是“静态”,这个不太好理解,上代码测试一下。
3.1 普通工具
3.1.1 代码
classTFUser{publicfunction__construct(bool$fromCallByFunc=false){if($fromCallByFunc){echo"福哥创建了".get_class($this)."的实例<br/>";}}publicfunctioncall_by_static(){returnnewstatic(true);}}$myUser=newTFUser();$myUser->call_by_static();
3.1.2 效果
可以看到普通工具里面static指向的还是方法所属工具本身,本例中便是TFUser这个工具。
3.2 继续工具
3.2.1 代码
classTFUser{publicfunction__construct(bool$fromCallByFunc=false){if($fromCallByFunc){echo"福哥创建了".get_class($this)."的实例<br/>";}}}classmyUserextendsTFUser{publicfunctioncall_by_static(){returnnewstatic(true);}}$myUser=newmyUser();$myUser->call_by_static();
3.2.2 效果
可以看到继续工具里面static指向的也还是方法所属工具本身,本例中便是myUser这个工具。
4. 差异可以创造self和static在普通工具和继续工具测试中的效果彷佛都是一样的,那么他们之间有什么差异呢?
4.1 代码
classTFUser{publicfunction__construct(bool$fromCallByFunc=false){if($fromCallByFunc){echo"福哥创建了".get_class($this)."的实例<br/>";}}publicfunctioncall_by_self(){returnnewself(true);}publicfunctioncall_by_static(){returnnewstatic(true);}}classmyUserAextendsTFUser{}classmyUserBextendsTFUser{}$myUserA=newmyUserA();$myUserA->call_by_self();$myUserA->call_by_static();$myUserB=newmyUserB();$myUserB->call_by_self();$myUserB->call_by_static();
4.2 效果
这下看明白了吧?
self在任何时候都是指向方法所属的工具本身,无论这个方法是继续调用还是直接调用。
static则指向实例化的工具本身,无论这个工具是普通工具还是继续工具。
5. 总结看完了self和static的用法和差异之后,相信我们大家都会有一些想法了吧?
利用self可以创建工具自身的实例这个没什么可说的了,但是利用static居然可以创建继续“我”的工具的实例,这个太牛了有没有!
!
!
https://m.tongfu.net/home/35/blog/513391.html