今天我在写PHP程序的时分,偶然发明在PHP的::操纵符十分壮大,不单单是只用在会见parent,sel,静态成员属性、常量下面,实在他的功效壮大了往了
这个标记在PHP中实践上叫做局限剖析符,这是PHP官方的注释php.net/manual/zh/language.oop5.paamayim-nekudotayim.php。可是官方中文部分只是复杂的先容了
人人一定又困惑这跟多承继有甚么干系呢,别急,心急吃不了热豆腐的!!!!!
实在这个局限操纵符另有一个很年夜的特征,就是当在类内部挪用一个非静态大众办法时,办法外部的$this指针会指向他以后运转地点工具自己(宿主工具),当一个类实例化时,办法内里$this永久指向的实例化后的工具自己,为何呢,由于这个办法是被这个工具挪用实行的,以是这个工具就是他的宿主工具。而方才我们间接在全局调中挪用这个办法时,因为这个办法运转时不在任何工具中,以是不存在任何宿主工具,以是假如在办法内里写$this的话会报致命毛病。那怎样才干具有宿主工具,然后间接挪用。细心看我方才讲的同砚大概注重到,我方才说过"由于这个办法是被这个工具挪用实行的,以是这个工具就是他的宿主工具"。以是实际上说,我们只需改动实行这个办法的地点情况,就能够改动他的宿主工具。上面我们来实行下
classa{
publicfunctionsay_name(){
echomynameis.$this->name;
}
}
classb{
public$name=xbs530;
publicfunctionrun(){
a::say_name();
}
}
$o=newb;
$o->run();
人人猜会输入甚么。。。。。。。
人人能够下手做一下实验。。。。。
因为a::say_name()是被工具$o挪用的,以是办法内里的$this天然指向了工具$o。很奇妙吧。。。。
这个我之前发的谁人PHP局限剖析操纵符中都有讲,好了基本就讲到这里,上面间接上多承继的代码了,接待吐槽。。。。。
/*
多承继基类
注:要想完成类多承继,必须起首承继此基类
*/
classmulti_extends{
publicfunction__construct(){
$this->_init_extends();
}
protectedfunction_init_extends(){
if(property_exists($this,_extends))
{
$extends=&$this->_extends;
foreach($extendsas$class)
{
$this->_extends($class);
}
}
}
publicfunction_extends($class_name){
//剖析方针
$ref=newReflectionClass($class_name);
//承继大众属性
$property_list=$ref->getProperties(ReflectionProperty::IS_PUBLIC);
foreach($property_listas$property)
{
$property_name=$property->name;
$property_value=$property->getValue(new$class_name);
if($property_name===_extends)
{
foreach($property_valueas$c)
{
$this->_extends[]=$c;
}
}else{
if(!property_exists($this,$property_name))
{
$this->{$property->name}=$property_value;
}
}
}
//承继大众办法
$method_list=$ref->getMethods(ReflectionMethod::IS_PUBLIC);
foreach($method_listas$method)
{
$this->_extends_method[$method->name]=$method->class;
}
}
function__call($m,$a){
if($c=$this->_extends_method[$m])
{
eval("$c::$m(".$a.");");
}
}
}
header(content-type:text/html;charset=utf-8);
classa{
public$a=5;
publicfunctionsay_name(){
echo我叫.$this->name.<br>;
}
}
classb{
functionsay_age(){
echo我往年.$this->age.岁<br>;
}
}
classcextendsmulti_extends{
public$_extends=array(a,b);
publicfunctionsay_hellow(){
echohellow.$this->name.<br>;
}
}
classd{
functionsay_goodbye(){
echogoodbye.$this->name.<br>;
}
}
classpersionextendsmulti_extends{
public$_extends=array(c,d);
public$name="熊宝山";
public$age="20";
}
//实行承继后的办法
$o=newpersion();
$o->say_name();
$o->say_age();
$o->say_hellow();
$o->say_goodbye();
有不分明的中央能够加QQ:987188548相互切磋下,邮件也能够:xbs530@yeah.net呵呵
欢迎光临 仓酷云 (http://ckuyun.com/) | Powered by Discuz! X3.2 |