php 语法恶心,PHP被忽视的一些语法(一)

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();//1

f1();//2

f1();//3

f2();//10

f2();//20

f2();//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

//静态方法内存在$this

class 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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值