|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
即使你理解不了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同样是最有效的。 |
|