PHP面向对象-----(总体学习路线)

来源:互联网 发布:售楼软件哪家好 编辑:程序博客网 时间:2024/06/18 17:10
中不能定义相同名称的方法, 也不能定义和PHP给我提供的方法的方法重名,当然在同一个类中也不能定义相同名称的方法。在子类这 个方法中可以调用到父类中被覆盖的方法, 也就是把被覆盖的方法原有的功能拿过来再加上自己的一点功能,可以通过两种方法实现在子类的方法中调用父类被覆盖的方法:构造方法在子类中如果没有声明的话,也可以使用父类中的构造方法,如果子类中重新定义了一个构造方法也会覆盖掉父类中的构造方法,如果想使用新的构造方法为所有属性赋值也可以用同样的方式。classStudentextendsPerson{ var $school;// 学生所在学校的属性 function __construct($name, $sex, $age, $school) { // 使用父类中的方法为原有的属性赋值 parent::__construct($name, $sex, $age); $this->school = $school; } // 这个学生学习的方法 function study() { echo "我的名子叫:" . $this->name . " 我正在" . $this->school . " 学习"; } // 这个人可以说话的方法, 说出自己的属性 function say() { parent::say(); // 加上一点自己的功能 echo "我的年龄是:" . $this->age . " 我在" . $this->school . "上学"; }}13.访问类型(publicprotectedprivatepublic (公有的、默认的),protected (受保护的)和private (私有的) privateprotectedpublic同一个类中 √ √ √类的子类中 √ √所有的外部成员 √14.final关键字的应用这个关键字只能用来定义类和定义方法, 不能使用final这个关键字来定义成员属性,因为final是常量的意思,我们在PHP里定义常量使用的是define()函数,所以不能使用final来定义成员属性。使用final关键标记的类不能被继承,使用final关键标记的方法不能被子类覆盖15.static和const关键字的使用(self::const/staticstatic成员能够限制外部的访问,因为static的成员是属于类的,是不属于任何对象实例,是在类第一次被加载的时候分配的空间,其他类是无法访问的,只对类的实例共享,能一定程度对类该成员形成保护;const是一个定义常量的关键字,在PHP中定义常量使用的是“define()”这个函数,但是在类里面定义常量使用的是“const”这个关键字,(类内)self(代表这个静态属性所在的类)(类外)(静态方属性所在的类)16.__toString()方法“__toString()”方法也是一样自动被调用的,是在直接输出对象引用时自动调用的“$p=new Person()“中,$p就是一个引用,我们不能使用echo 直接输出$p,这样会输出“Catchable fatal error: Object of classPersoncouldnotbeconvertedtostring”这样的错误,如果你在类里面定义了“__toString()”方法,在直接输出对象引用的时候,就不会产生错误,而是自动调用了”__toString()”方法, 输出“__toString()”方法中返回的字符,所以“__toString()”方法一定要有个返回值(return 语句)。<?php//DeclareasimpleclassclassTestClass{public $foo; public function __construct($foo) { $this->foo = $foo; } // 定义一个__toString方法,返加一个成员属性$foopublic function __toString() { return $this->foo; }}$class = new TestClass('Hello');// 直接输出对象echo $class;?>17.克隆对象__clone()方法在PHP4中我们使用“clone”这个关键字克隆对象;<?classPerson{// 下面是人的成员属性 var $name;// 人的名子 var $sex; // 人的性别 var $age; // 人的年龄// 定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值 function __construct($name ="", $sex = "", $age = "") { $this->name = $name; $this->sex = $sex; $this->age = $age; } // 这个人可以说话的方法,说出自己的属性 function say() { echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>"; }}$p1 = new Person("张三","男",20);// 使用“clone”克隆新对象p2,和p1对象具有相同的属性和方法。$p2=clone $p1;$p2->say();?>PHP4定义了一个特殊的方法名“__clone()”方法,是在对象克隆时自动调用的方法,用“__clone()”方法将建立一个与原对象拥有相同属 性和方法的对象,如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法,“__clone()”方法可以没有参数,它自 动包含$this和$that两个指针,$this指向复本,而$that指向原本;<?classPerson{// 下面是人的成员属性 var $name;// 人的名子 var $sex; // 人的性别 var $age; // 人的年龄// 定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值 function __construct($name ="", $sex = "", $age = "") { $this->name = $name; $this->sex = $sex; $this->age = $age; } // 这个人可以说话的方法, 说出自己的属性 function say() { echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>"; } // 对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法 function __clone() { // $this指的复本p2, 而$that是指向原本p1,这样就在本方法里,改变了复本的属性。 $this->name = "我是假的 $that->name"; $this->age = 30; }}$p1 = new Person("张三","男",20);$p2 = clone $p1;$p1->say();$p2->say();?>18.__call()处理调用错误下面我们加上“__call()”方法,这个方法有2个参数,第一个参数为调用不存在的方法过程中,自动调用__call()方法时,把这个不存在的方法的方法名传给第一个参数,第二个参数则是把这个方法的多个参数以数组的形式传进来。<?php//这是一个测试的类,里面没有属性和方法classTest{// 调用不存的方法时自动调用的方法,第一个参数为方法名,第二个参数是数组参数 function __call($function_name, $args) { print"你所调用的函数:$function_name(参数:"; print_r($args); echo ")不存在!<br>"; }}// 产生一个Test类的对象$test=new Test();// 调用对象里不存在的方法$test->demo("one","two","three");// 程序不会退出可以执行到这里echo"this is a test<br>";?>19.抽象方法和抽象类(abstract)定义抽象类就相当于定义了一种规范,这种规范要求子类去遵守,子类继承抽象类之后,把抽象类里面的抽象方法按 照子类的需要实现。<?abstractclassDemo{ var $test;abstract function fun1(); abstract function fun2(); function fun3() { ... }}$demo = new Demo(); // 抽象类不能产生实例对象,所以这样做是错的,实例化对象交给子类classTestextendsDemo{ function fun1() { ... } function fun2() { ... }}$test = new Test(); // 子类可以实例化对象,因为实现了父类中所有抽象方法?>20.PHP5接口技术(interface)接口是一种特殊的抽象类,抽象类又是一种特殊的类,所以接口也是一种特殊的类,为 什么说接口是一种特殊的抽象类呢?如果一个抽象类里面的所有的方法都是抽象方法,那么我们就换一种声明方法使用“接口”;也就是说接口里面所有的方法必须 都是声明为抽象方法,另外接口里面不能声明变量(但可声明常量constant),而且接口里面所有的成员都是public权限的。PHP中不仅一个类可以实现多个接口,也可以在继承一个类的同时实现多个接口, 一定要先继承类再去实现接口;<?php// 使用extends继承一个类,使用implements实现多个接口classFourextends 类名一implemtns 接口一, 接口二, ...{// 所有接口中的方法都要实现才可以实例化对象 ...}?>21.多态的应用所谓多态性是指一段程序能够处理多种类型对象的能力比如说在公司上班,每个月财务发放工资,同一个发工资的方法,在公司内不同的员工或是不同职位的员工,都是通过这个方法发放的,但是所发的工资都是不相同的。所以同一个发工资的方法就出现了多种形态22.把对象串行化serialize()方法,__sleep()方法,__wakeup()方法有时候需要把一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串,等到达另一端时,再还原为原来的对象,这个过程称之为串行化__sleep()函数不接受任何参数, 但返回一个数组__wakeup()方法做一些对象醒来就要做的动作。<?classPerson{// 下面是人的成员属性 var $name;// 人的名子 var $sex; // 人的性别 var $age; // 人的年龄// 定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值 function __construct($name ="", $sex = "", $age = "") { $this->name = $name; $this->sex = $sex; $this->age = $age; } // 这个人可以说话的方法, 说出自己的属性 function say() { echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>"; } // 指定串行化时把返回的数组中$name和$age值串行化,忽略没在数组中的属性$sex function __sleep() { $arr = array("name","age");// 此时,属性$sex将被删除!!!return($arr); } // 重新生成对象时,并重新赋值$age为40 function __wakeup() { $this->age = 40; }}$p1 = new Person("张三","男",20);// 把一个对象串行化,返一个字符串,调用了__sleep()方法,忽略没在数组中的属性$sex$p1_string = serialize($p1);echo $p1_string ."<br>";// 串行化的字符串我们通常不去解析$p2 = unserialize($p1_string);// 反串行化形成对象$p2重新赋值$age为40$p2->say();?>23.自动加载类 __autoload()函数_autoload() 是专门为 类的不存在 而设计的!!!很多框架利用这个函数,实现 类文件的自动加载 !!!
原创粉丝点击