活着的死人 发表于 2015-1-16 22:15:04

PHP网页编程之php使用反射真正完成多承继(非接口摹拟...

即使你理解不了PHP,但是也必须先跟它混个脸熟,看,一遍遍的看,看的同时一边琢磨,一边按照它所教的打代码,即使你搞不清楚那些代码到底是干嘛的,但是起码你应该找找感觉。今天我在写PHP程序的时分,偶然发明在PHP的::操纵符十分壮大,不单单是只用在会见parent,sel,静态成员属性、常量下面,实在他的功效壮大了往了


这个标记在PHP中实践上叫做局限剖析符,这是PHP官方的注释php.net/manual/zh/language.oop5.paamayim-nekudotayim.php。可是官方中文部分只是复杂的先容了会见parent,sel,静态成员属性、常量的感化,而上面英文部分,大概因为我们这些吊逝世对英文欠好的原因,就没看下往了,完成上,上面另有一个壮大的特征,我们人人都没看到。
甚么叫局限操纵符呢,大概良多人都没有仔细的往剖析过,这几个字,依据我这两年的编程的了解,我以为应当是界说了类中的成员属性和成员办法的地点局限,感到有点相似定名空间的感到。
而self::method();实在指的就是挪用以后局限里的method办法,那parent天然指的就是父类地点局限,这就是为何,我们在子类中掩盖父类的办法,我们仍旧能够用parent::method()会见的缘故原由。人人还要注重一点,self永久指向的是实在声明地位地点类自己和而parent永久指向的是声明地位地点类的父类,不会受承继高低文的影响而改动。
后面讲的这些大概人人有些人已晓得了,下面说过::在PHP中叫局限剖析操纵符,下面我说过了既然,parent和self都能指向一个类局限的代名词,那试想下,我们能不克不及用类名指向某个局限呢,谜底固然是能够的。我们能够如许
复制代码
[*]classa{
[*]publicfunctiondemo(){
[*]echoabc;
[*]}
[*]}
[*]
[*]
[*]
[*]
[*]a::demo();
不晓得人人发明没,内里的demo办法其实不静态办法,但我却能够如许会见,那是由于a::指向的class局限,以是能够会见时面的demo办法,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呵呵在学习HTML中我想边学边做是最有效的方式,当然这一方式对于学习PHP同样是最有效的。

金色的骷髅 发表于 2015-1-18 12:56:13

如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,

分手快乐 发表于 2015-1-22 05:40:56

使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的

仓酷云 发表于 2015-1-30 23:11:07

本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。

小魔女 发表于 2015-2-17 09:45:46

最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。

只想知道 发表于 2015-3-5 19:04:53

写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。

愤怒的大鸟 发表于 2015-3-12 11:57:57

微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。

小妖女 发表于 2015-3-19 21:59:37

,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
页: [1]
查看完整版本: PHP网页编程之php使用反射真正完成多承继(非接口摹拟...