self和static可以调用静态属性和静态函数以及非静态函数 此时
标签:
这篇文章主要介绍了PHP面向东西措施设计中的self、static、parent关键字用法,结合实例形式分析了self、static、parent关键字成果、应用场景及相关使用技巧,需要的伴侣可以参考下,本文实例讲述了PHP面向东西措施设计中的self、static、parent关键字用法.分享给大家供大家参考,具体如下:看到php里面有关于后期静态绑定的内容,虽然没有完全看懂,但是也收获不少对象。
不存在担任的时候,不存在担任的意思就是,就书写一个单独的类来使用的时候。self和static在范畴解析操纵符 (::) 的使用上,并无区别。
在静态函数中,self和static可以挪用静态属性和静态函数(没有实例化类,因此不能挪用非静态的属性和函数)。
在非静态函数中,self和static可以挪用静态属性和静态函数以及非静态函数
此时,self和static的表示是一样的,可以替换为该类名的方法挪用。 <?php class Demo{ public static $static; public $Nostatic; public function __construct(){ self::$static = "static"; $this->Nostatic = "Nostatic"; } public static function get(){ return __CLASS__; } public function show(){ return "this is function show with ".$this->Nostatic; } public function test(){ echo Demo::$static."<br/>"; //使用类名挪用静态属性 echo Demo::get()."<br/>"; //使用类名挪用静态属性 echo Demo::show()."<br/>"; //使用类名挪用静态属性 echo self::$static."<br/>"; //self挪用静态属性 echo self::show()."<br/>"; //self挪用非静态要领 echo self::get()."<br/>"; //self挪用静态要领 echo static::$static."<br/>";//static挪用静态属性 echo static::show()."<br/>";//static挪用非静态要领 echo static::get()."<br/>"; //static挪用静态要领 } } $obj = new Demo(); $obj->test();
输出功效;
static Demo this is function show with Nostatic static this is function show with Nostatic Demo static this is function show with Nostatic Demo担任的时候
在担任时,self和static在范畴解析操纵符 (::) 的使用上有分歧。parent也是在担任的时候使用的。
输出功效:
this is class A this is class Bself挪用的静态要领或属性始终暗示其在使用的时候确当前类(A)的要领或属性,可以替换为其类名,但是在类名很长或者有可能变革的情况下,使用self::的方法无疑是更好的选择。
static挪用的静态要领或属性会在担任中被其子类重写笼罩,应该替换为对应的子类名(B)。
parent关键字用于挪用父类的要领和属性。在静态要领中,,可以挪用父类的静态要领和属性;在非静态要领中,可以挪用父类的要领和属性。
输出功效;
static this is function show with Nostatic在文章的最后,我们分析一个手册上的例子
<?php class A { public static function foo() { static::who(); } public static function who() { echo __CLASS__."\n"; } } class B extends A { public static function test() { A::foo(); parent::foo(); self::foo(); } public static function who() { echo __CLASS__."\n"; } } class C extends B { public static function who() { echo __CLASS__."\n"; } } C::test(); ?>输出功效
A C C我们单独拿出test要领进行分析:
public static function test() { A::foo(); parent::foo(); self::foo(); }1)A::foo();这个语句是可以在任何处所执行的,它暗示使用A去挪用静态要领foo()得到‘A‘。
2)parent::foo();C的parent是B,B的parent是A,回溯找到了A的foo要领;static::who();语句中的static::挪用的要领会被子类笼罩,所以优先挪用C的who()要领,如果C的who要领不存在会挪用B的who要领,如果B的who要领不存在会挪用A的who要领。所以,输出功效是‘C‘。[注1]
3)self::foo();这个self::是在B中使用的,所以self::等价于B::,但是B没有实现foo要领,B又担任自A,所以我们实际上挪用了A::foo()这个要领。foo要领使用了static::who()语句,导致我们又挪用了C的who函数。[注2]
输出功效:
A B B温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/32990.html