PHP面向对象详解(三)
面向对象对象概念是面向对象技术的核心。在显示世界里我们所面对的事情都是对象,如计算机、电视机、自行车等。在面向对象的程序设计中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象.
对象的主要三个特性
对象的行为:可以对对象施加那些操作,开灯,关灯就是行为。
对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型。
对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同。
面向对象模型
面向对象的概念:
oop(面向对象的编程)它能是其代码更加简洁易于维护并且具有更强的可重性
1、PHP面向对象(三)
四、OOP的高级实践
4.3Static-静态成员
<?php date_default_timezone_set("PRC"); /** *1.类的定义以class关键字开始,后面跟着这个类的名称。类的名称命名通常每个单词的第一个字母大写。 *2.定义类的属性 *3.定义类的方法 *4.实例化类的对象 *5.使用对象的属性和方法 */ classHuman{ public$name; public$height; public$weight; publicfunctioneat($food){ echo$this->name."'seating".$food."<br/>"; } } classAnimal{ public$kind; public$gender; } classNbaPlayerextendsHuman{ //类的属性的定义 public$name="Jordan";//定义属性 public$height="198cm"; public$weight="98kg"; public$team="Bull"; public$playerNumber="23"; private$age="44"; public$president="DavidStern"; //类的方法的定义 publicfunctionchangePresident($newP){ $this->president=$newP; } publicfunctionrun(){ echo"Running<br/>"; } publicfunctionjump(){ echo"Jumping<br/>"; } publicfunctiondribble(){ echo"Dribbling<br/>"; } publicfunctionshoot(){ echo"Shooting<br/>"; } publicfunctiondunk(){ echo"Dunking<br/>"; } publicfunctionpass(){ echo"Passing<br/>"; } publicfunctiongetAge(){ echo$this->name."'sageis".$this->age; } function__construct($name,$height,$weight,$team,$playerNumber){ print$name.";".$height.";".$weight.";".$team.";".$playerNumber."\n"; $this->name=$name;//$this是php里面的伪变量,表示对象自身 $this->height=$height;//通过$this可以设置对象的属性值 $this->weight=$weight; $this->team=$team; $this->playerNumber=$playerNumber; } } /** *1.类实例化为对象时使用new关键字,new之后紧跟类的名称和一对括号。 *2.使用对象可以像使用其他值一样进行赋值操作 */ $jordan=newNbaPlayer("Jordan","198cm","98kg","Bull","23");echo"<br/>"; $james=newNbaPlayer("James","203cm","120kg","Heat","6");echo"<br/>"; //访问对象的属性使用的语法是->符号,后面跟着属性的名称 echo$jordan->name."<br/>"; //调用对象的某个方法使用的语法是->符号,后面跟着方法的名称和一对括号 $jordan->run(); $jordan->pass(); //子类调用父类的方法 $jordan->eat("apple"); //试着调用private,直接以及通过内部的public函数 //$jordan->age; $jordan->getAge();echo"<br/>"; $jordan->changePresident("AdamSilver"); echo$jordan->president."<br/>"; echo$james->president."<br/>"; 直接从上述例子开始吧。 这里想得到的是,把两位对象的某一个变量同时变掉。——用static publicstatic$president="DavidStern"; //类的方法的定义 publicstaticfunctionchangePresident($newP){ static::$president=$newP;//这里static换成self更符合规范 }
注意这里static的位置,以及,方法内的::
调用的方法也有所变动。
echoNbaPlayer::$president;echo"<br/>"; NbaPlayer::changePresident("AdamSilver"); echoNbaPlayer::$president;echo"<br/>";
也就是像之前说的,静态成员就是个常量,所以不针对某个具体的对象(不受具体对象的约束)——基于此,定义&赋值&调用都不需要具体的对象参与。
内部调用要用self/static::$...
外部调用,类名::
用处就是所有的对象共用的数据。
--如果内部调用时,变量在父类中
比如说,在上述例子中,父类human中写这么一句话
publicstatic$aaa="dafdfa";
然后在子类nbaplayer中,调用父类的静态成员时,要
echoparent::$aaa;
而外部调用,按照上面说的,类名::,所以,直接父类类名即可
echoHuman::$aaa;
--其他
在静态方法中,是无法访问其他变量的,也就是说,不能用$this->
--小结
/**
*静态成员
*1.静态属性用于保存类的公有数据
*2.静态方法里面只能访问静态属性
*3.静态成员不需要实例化对象就可以访问
*4.类内部,可以通过self或者static关键字访问自身的静态成员
*5.可以通过parent关键字访问父类的静态成员
*6.可以通过类名称在外部访问类的静态成员
*/
4.4Final成员
--问题
不希望某个类拥有子类;
不希望子类修改父类中的某个变量(避免重写?)
--final
》=php5版本
举个例子
classBaseClass{ publicfunctiontest(){ echo"BaseClass::testcalled<br/>"; } publicfunctiontest1(){ echo"BaseClass::test1called<br/>"; } } classChildClassextendsBaseClass{ publicfunctiontest(){ echo"ChildClass::testcalled<br/>"; } } $obj=newChildClass(); $obj->test();
子类中编写跟父类中完全一致的方法名(内容可以不同),会完成对父类方法的重写!
所以,不希望被重写的父类中的方法,写上final
finalpublicfunctiontest(){
依此类推,对于不想有子类的父类,在类名那里写上final
finalclassBaseClass{
--小结
/**
*重写和Final
*1.子类中编写跟父类完全一致的方法可以完成对父类方法的重写
*2.对于不想被任何类继承的类可以在class之前添加final关键字
*3.对于不想被子类重写(overwrite,修改)的方法,可以在方法定义前面添加final关键字
*/
4.5数据访问
先把final都去掉
--parent
然后再子类中的方法中写
parent::test();
运行后会发现,依然可以通过parent的关键字调用父类中,即使是被重写的数据
--self
然后在父类中的方法test中写
self::test1();
运行后,发现self可以调用同一个类中的数据(其他方法/静态变量/常量const)
--小结
/**
*数据访问补充
*1.parent关键字可以用于调用父类被重写的类成员
*2.self关键字可以用于访问类自身的成员方法,也可以用于访问自身的静态成员和类常量;不能用于访问类自身的属性;访问类常量时不用在常量名称前面加$符号
*3.static关键字用于访问类自身定义的静态成员,访问静态属性时需要在属性名前面添加$符号
*/
4.6对象接口
非常重要!!!
--问题
不同的类,有着相同的行为,但相同的行为又有着不同的实现方法。
比如人和动物都会吃东西,但吃的方式方法又不太一样。
--定义
接口就是把不同类的共同行为进行了定义,然后在不同的类里面实现不同的功能。
--栗子
//定义一个接口 interfaceICanEat{ publicfunctioneat($food); }
可以看到,接口中并没有方法的具体实现,但必须有方法!
那么,下面是,“人类会吃”
//具体对象,连接到接口 classHumanimplementsICanEat{ publicfunctioneat($food){ echo"Humaneating".$food.".<br/>"; } } $obj=newHuman(); $obj->eat("shit");
请忽略我给出的“食物”。
注意,不再用extends,而是implements。然后,同样是方法名的完全相同。然后,对象必须/最好实现方法。
继续
interfaceICanEat{ publicfunctioneat($food); } //具体对象,连接到接口 classHumanimplementsICanEat{ publicfunctioneat($food){ echo"Humaneating".$food.".<br/>"; } } classAnimalimplementsICanEat{ publicfunctioneat($food){ echo"Animaleating".$food.".<br/>"; } } $obj=newHuman(); $obj->eat("shit"); $monkey=newAnimal(); $monkey->eat("banana");
让动物也吃起来!
--逆向操作
判断某个对象是否连接了某个接口。
var_dump($objinstanceofICanEat);
会返回boolean值。
--更多的栗子
interfaceICanPeeextendsICanEat{ publicfunctionpee(); } classDemonimplementsICanPee{ publicfunctionpee(){ echo"Candemonpee?"; } publicfunctioneat($food){ echo"Candemoneat".$food; } } $ghost=newDemon(); $ghost->pee(); $ghost->eat("shit");
接口本质上也是类,可以被继承/继承,但是使用继承接口的接口,所有父类、“爷类”的方法都要有具体实现。
--小结
/**
*接口
*1.接口的基本概念和基本使用方法
*2.接口里面的方法没有具体的实现
*3.实现了某个接口的类必须提供接口中定义的方法
*4.不能用接口创建对象,但是能够判断某个对象是否实现了某个接口
*5.接口可以继承接口(interfaceextendsinterface)
*6.接口中定义的所有方法都必须是公有,这是接口的特性。
*/
aaaaaaaaaaaaaa
buxiangxiele....................
mingtianyaoge..............
以上内容是小编给大家介绍的PHP面向对象详解(三),希望大家喜欢。