php面向对象编程-三大特征.doc
php面向对象编程-三大特征1、封装首先先介绍一个抽象的概念抽象:我们在前面去定义一个类时候,实际上就是把一类事物的共有的属性和行为提取出来形成一个物理模型(模板)。这种研究问题的方法称为抽象。那么什么是封装呢?封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行操作。上边概念中我标蓝的部分中提到了封装时的数据保护和方法的授权,因此,在彻底了解封装之前先说一下访问控制修饰符。public表示全局,类内部、外部和子类都可以访问;protected表示受保护的,只有本类或子类可以访问;private表示私有的,只有本类内部可以使用;php中对象的成员变量的访问属性不能是默认的比如:classPerson{$name=‘abc’;}$p1=newPerson();是错误的!!例子:classPerson{public$name;public$age;private$salary;publicfunctionPerson($name,$age,$salary){$this->name=$name;$this->age=$age;$this->salary=$salary;}publicfunctiongetSalary(){return$this->salary;}}$p1=newPerson(“某某“,10000);echo 工资= .$p1->getSalary();上面例子当中$salary就是一个私有的属性不能在类的外部访问。这样就起到了一些数据的保护和通过一些授权的方法去访问这个数据,也就体现出了封装的含义。此外访问private和protected这些属性的时候还有一个办法,这是php自带的一对魔术函数。用一对__set和__get方法就可以处理所有的private和protected属性。下边我举一个例子来说明他的用法,顺便解释一下这个函数的含义。classMyfun{protected$name;private$age;//当这个对象试图去修改一个不存在的属性的时候自动调用第一个参数代表要修改的属性的名称,第二个参数代表要修改的值。(因为private和protected在类的外部是不让访问的所以在类外部访问的时候会认为该属性不存在所以会调用这个函数)function__set($pro_name,$pro_value){$this->$pro_name=$pro_value;}//当这个对象试图去访问一个不存在的对象的时候会自动调用function__get($pro_name){if(isset($pro_name)){return$this->$pro_name;}else{returnnull;}}}$m=newMyfun();$m->name=“张三“;echo“你的名字:“.$m->name;$m->age=89;echo“你的年龄是“.$m->age;这个方法在实际开发中不推荐使用,可以自己写一个类似这样的方法去自己控制。classTest{private$name;publicfunctiongetName(){//这里可以增加一些自己的判断什么的,控制比较方便return$this->name;}publicfunctionsetName($name){//这里可以增加一些自己的判断什么的,控制比较方便$this->name=$name;}}$t=newTest();$t->setName(“张三“);echo$t->getName();上边的例子当中没有体现出成员方法的访问修饰符,在下边继承中说道,因为成员方法的访问修饰需要在子类中才能看到效果。补充知识:上边例子当中我提到了一个魔术函数,下边我把php的魔术函数给大家介绍一下:魔术函数:1。__construct()实例化对象时被调用,当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。2。__destruct()当删除一个对象或对象操作终止时被调用。3。__call()对象调用某个方法,若方法存在,则直接调用;若不存在,则会去调用__call函数。4。__get()读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用__get函数。5。__set()设置一个对象的属性时,若属性存在,则直接赋值;若不存在,则会调用__set函数。6。__toString()打印一个对象的时被调用。如echo$obj;或print$obj;7。__clone()克隆对象时被调用。如:$t=newTest();$t1=clone$t;8。__sleep()serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。9。__wakeup()unserialize时被调用,做些对象的初始化工作。10。__isset()检测一个对象的属性是否存在时被调用。如:isset($c->name)。11。__unset()unset一个对象的属性时被调用。如:unset($c->name)。12。__set_state()调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。13。__autoload()实例化一个对象时,如果对应的类不存在,则该方法被调用。魔术常量:1。__LINE__返回文件中的当前行号。2。__FILE__返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自PHP4.0.2起,__FILE__总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。3。__FUNCTION__返回函数名称(PHP4.3.0新加)。自PHP5起本常量返回该函数被定义时的名字(区分大小写)。在PHP4中该值总是小写字母的。4。__CLASS__返回类的名称(PHP4.3.0新加)。自PHP5起本常量返回该类被定义时的名字(区分大小写)。在PHP4中该值总是小写字母的。5。____返回类的方法名(PHP5.0.0新加)。返回该方法被定义时的名字(区分大小写)。2、继承继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过class子类名extends父类名{}这样,子类就会自动拥有父类定义的属性和方法。name. 年龄= .$this->age;}publicfunctiongetName(){return$this->name;}}classPupilsextendsStu{publicfunctiontesting(){echo 小学生;}}classGraduateextendsStu{publicfunctiontesting(){echo 大学生 ;}}$pupil1=newPupils();$pupil1->name=“小学生“;$pupil1->age=10;$pupil1->printInf