PHP中有一些几乎不会关注和关心的‘细枝末节’。

如果你敢说你精通PHP,不了解这个系列就算不得什么精通。也就应该继续了解以下内容。

第一篇new self() 和 new static()

1 . new self()


self的用法有

1》引用类常量

classA{constDATELINE='20170101';publicfunctioncheck_newyear(){return(@date('Ymd')>=self::DATELINE);}}var_dump((newA)->check_newyear());//bool(true)

2》引用类静态方法

classA{constDATELINE='20170101';publicfunctioncheck_newyear(){returnself::is_newyear();}publicstaticfunctionis_newyear(){return(@date('Ymd')>=self::DATELINE);}}var_dump((newA)->check_newyear());//bool(true)

3》引用非静态方法(不推荐)

classA{constDATELINE='20170101';publicfunctioncheck_newyear(){returnself::is_newyear();}publicfunctionis_newyear(){return(@date('Ymd')>=self::DATELINE);}}

self 完全等同于self所在 类名

self 完全可以用当前类 类名 替代

classA{constAGE=1;publicfunctiontest(){returnself::AGE;}}classBextendsA{constAGE=2;}var_dump((newB)->test());//int(1)//--------------------------------classA{constAGE=1;publicfunctiontest(){returnself::AGE;}}classBextendsA{constAGE=2;publicfunctiontest(){returnself::AGE;}}var_dump((newB)->test());//int(2)

以上俩段代码可以验证这一点。


由此类推如下代码就简单了:

classA{publicfunctioninstance(){returnnewself();}}var_dump((newA)->instance());//可替代为classA{publicfunctioninstance(){returnnewA();}}var_dump((newA)->instance());


classA{publicfunctioninstance(){returnnewself();}}classBextendsA{publicfunctioninstance(){returnnewself();}}var_dump((newB)->instance());//可替代为classA{publicfunctioninstance(){returnnewA();}}classBextendsA{publicfunctioninstance(){returnnewB();}}var_dump((newB)->instance());


2. new static()


static的用法

1》方法静态变量

functionf1(){static$a;$a++;var_dump($a);}functionf2(){static$a;$a+=10;var_dump($a);}f1();//1f1();//2f1();//3f2();//10f2();//20f2();//30

方法里的静态变量属于方法,作用域也指向当前方法。


2》类静态属性

classA{publicstatic$name='zhangsan';publicfunctiontest(){returnself::$name;}}var_dump((newA)->test());


3》类静态方法

classA{publicstatic$name='zhangsan';publicstaticfunctiontest(){returnself::$name;}}var_dump((newA)->test());

附错误例

//Error1//$name为非静态变量classA{public$name='zhangsan';publicstaticfunctiontest(){returnself::$name;}}//Error2//静态方法内存在$thisclassA{public$name='zhangsan';publicstaticfunctiontest(){return$this->name;}}


而我们知道,静态属性属于类本身,所以静态对象也存在继承。

classA{publicstatic$name='zhangsan';publicfunctiontest(){returnself::$name;}}classBextendsA{publicfunctiontest(){returnself::$name;}}var_dump((newB)->test());//zhangsan

在继承中static是动态的

classA{publicstatic$name='zhangsan';publicstaticfunctiontest(){returnself::$name;}publicstaticfunctiontest1(){returnstatic::$name;}}classBextendsA{publicstatic$name="lisi";}var_dump(A::test1());//zhangsan;var_dump(B::test1());//lisi;

其实, static 是 self 的补充。


3 . new self() 和 new static() 的不同

classA{publicstatic$name='zhangsan';publicfunctiontest(){returnnewself();}publicfunctiontest1(){returnnewstatic();}}classBextendsA{}var_dump((newA)->test());//A;var_dump((newA)->test1());//A;var_dump((newB)->test());//A;var_dump((newB)->test1());//B;