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

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

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

1 . new self()

self的用法有

1》引用类常量

class A{    const DATELINE = '20170101';    public function check_newyear(){        return (@date('Ymd') >= self::DATELINE);    }}var_dump((new A)->check_newyear());//bool(true)

2》引用类静态方法

class A{    const DATELINE = '20170101';    public function check_newyear(){        return self::is_newyear();    }    public static function is_newyear(){        return (@date('Ymd') >= self::DATELINE);    } }var_dump((new A)->check_newyear());//bool(true)

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

class A{    const DATELINE = '20170101';    public function check_newyear(){        return self::is_newyear();    }    public function is_newyear(){        return (@date('Ymd') >= self::DATELINE);    } }

self 完全等同于self所在 类名

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

class A{	const AGE = 1;	public function test(){		return self::AGE;	}}class B extends A{	const AGE = 2;}var_dump((new B)->test());//int(1)//--------------------------------class A{	const AGE = 1;	public function test(){		return self::AGE;	}}class B extends A{	const AGE = 2;	public function test(){		return self::AGE;	}}var_dump((new B)->test());//int(2)

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

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

class A{	public function instance(){		return new self();	}}var_dump((new A)->instance());//可替代为class A{	public function instance(){		return new A();	}}var_dump((new A)->instance());

class A{	public function instance(){		return new self();	}}class B extends A{	public function instance(){		return new self();	}}var_dump((new B)->instance());//可替代为class A{	public function instance(){		return new A();	}}class B extends A{	public function instance(){		return new B();	}}var_dump((new B)->instance());

2. new static()

static的用法

1》方法静态变量

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

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

2》类静态属性

class A{    public static $name = 'zhangsan';    public function test(){	return self::$name;    }}var_dump((new A)->test());

3》类静态方法

class A{    public static $name = 'zhangsan';    public static function test(){	return self::$name;    }}var_dump((new A)->test());

附错误例

//Error1//$name 为非静态变量class A{    public $name = 'zhangsan';    public static function test(){	return self::$name;    }}//Error2//静态方法内存在$thisclass A{    public $name = 'zhangsan';    public static function test(){	return $this->name;    }}

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

class A{    public static $name = 'zhangsan';    public function test(){	return self::$name;    }}class B extends A{    public function test(){	return self::$name;    }}var_dump((new B)->test());//zhangsan

在继承中static是动态的

class A{    public static $name = 'zhangsan';    public static function test(){	return self::$name;    }    public static function test1(){        return static::$name;    }}class B extends A {    public static $name = "lisi";}var_dump(A::test1()); //zhangsan;var_dump(B::test1()); //lisi;

其实, static 是 self 的补充。

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

class A{    public static $name = 'zhangsan';    public function test(){	return new self();    }        public function test1(){        return new static();    }}class B extends A {    }var_dump((new A)->test());  //A;var_dump((new A)->test1()); //A;var_dump((new B)->test());  //A;var_dump((new B)->test1()); //B;