PHP面向对象的程序设计

belm

贡献于2012-01-03

字数:0 关键词: PHP开发 PHP

PHP面向对象的程序设计 网址:www.lampbrother.net 电话:400 700 1307 PHP面向对象的程序设计 1. 面向对象的介绍 2. 如何抽象一个类 3. 通过类实例化对象 4. 封装性 5. 继承性 6. 常见的关键字和魔术方法 7. 抽象类与接口 8. 多态性的作用 一、面向对象的介绍 ™ 1.1 面向对象的程序设计 ™ 1.2 类和对象的关系 1.1 面向对象程序设计概述 ™ 面向对象 ¾ 对象的概念是面向对象技术的核心。在现实世界里,我们面 对的所有事物都是对象,如计算机、电视机、自行车等。在 面向对象的程序设计中,对象是一个由信息及对信息进行处 理的描述所组成的整体,是对现实世界的抽象。 ™ 面向对象的三个主要特性: ¾ 对象的行为:可以对对象施加哪些操作;如电视机的开、关、 转换频道等。 ¾ 对象的状态:当施加那些方法时,对象如何响应;如电视机 的外形、尺寸、颜色等; ¾ 对象的标识:如何区分具有相同行为与状态的不同对象。 PHP 5的面向对象模型 ™ 面向对象的概念(OOP) OOP(Object-Oriented Programming, 面向对象的编程) 技术为编程人员敞开了一扇大门,使其编程的代码更 简洁、更易于维护,并且具有更强的可重用性。 ™ 什么是类? 类是具有相同属性和服务的一组对象的集合。它 为属于该类的所有对象提供了统一的抽象描述,其内 部包括属性和服务两个主要部分。在面向对象的编程 语言中,类是一个独立的程序单位,它应该有一个类 名并包括属性说明和服务说明两个主要部分。 ™ 什么是对象? 对象是系统中用来描述客观事物的一个实体,它是构成 系统的一个基本单位,数据与代码都被捆绑在一个实体中。一 个对象由一组属性和对这组属性进行操作的一组行为组成。 更抽象的角度来说,对象是问题域或实现域中某些事物 的一个抽象,它反映该事物在系统中需要保存的信息和发挥 的作用;它是一组属性和有权对这些属性进行操作的一组行 为的封装体。客观世界是由对象和对象之间的联系组成的。 ™ 类和对象的关系 类与对象的关系就如模具和铸件的关系,类的实例化结 果就是对象,而对对象的抽象就是类.类描述了一组有相同特 性(属性)和相同行为(方法)的对象。 从PHP4到PHP5是一次全新革新,PHP5已经完全支持面向 对象,而不是再像PHP4那样仅仅实现一个继承的功能,增加 了大量的特性和修正基本“对象”的行为。 二、如何抽象一个类 ™ 2.1 类的声明 ™ 2.2 成员属性与方法 2.1 类的声明 ™ 格式: ¾ class classname{ [ public $property [=value];...] //属性 [ function functionname ( args ){ 代码 } ...] //类的方法(成员函数) } 生成对象(类的实例化): $对象名=new classname( ); 2.2 成员属性与方法 ™ 属性: 通过在类定义中使用关键字" public"来声明变量,即 创建了类的属性。 如: public $somevar; ™ 方法(成员函数): 通过在类定义中声明函数,即创建了类的方法。 如: function somefun(参数列表) { ... ... } ™ 属性与方法的访问: PHP中属性与方法的引用操作符是“ ->” 格式:对象->属性或方法。 ™ 实例: ™ name."
"; } } $zhangsan=new Person(); //生成对象zhangsan $zhangsan->name="zhangsan"; //给对象中的name赋值 $zhangsan->age=26; //给对象中的age赋值 $zhangsan->say(); //调用方法say() echo "age is ".$zhangsan->age; //输出age值 ™ ?> 三、通过类实例化对象 ™ 3.1 创建对象 ™ 3.2 对象类型在内存中的分配 ™ 3.3 对象中成员的访问 ™ 3.4 特殊的对象引用”$this” ™ 3.5 构造方法与析构方法 3.1 创建对象 ™ 对象的创建: 当定义好类后,我们使用new关键字来生成一个对象。 $对象名称 = new 类名称(); 由于对象资料封装的特性,对象属性(类中定义的变 量)是无法由主程序区块直接来访问的,必须通过对象来 调用类中所定义的属性和行为函数,间接地达成存取控制 类中资料的目的。 ™ 使用对象属性: 在一个类中,可以访问一个特殊的指针$this,例如上面 的Person类中一个属性为$name,则当在该类中通过一个操 作设置或访问该变量时,使用$this->name来引用. 3.2 对象类型在内存中的分配 ™ 对象和类的关系: ¾ 对象是实际存在的,占有动态资源。 ¾ 类是对象的蓝图,可能占有静态资源。 ¾ 对象属性占有动态资源 ¾ 类(静态)属性实际上是有类名字空间上的“全局变量” ™ 性能考虑: ¾ 每个对象要单独占用数据空间 ¾ 增加的调用层次可能消耗执行时间 3.3 对象中成员的访问 类中包含成员属性与成员方法两个部分,我 们可以使用“new”关键字来创建一个对象,即: $对象名 = new 类名(构造参数);那么我们可以 使用特殊运算符“->”来访问对象中的成员属性 或成员方法。如: $对象名 = new 类名(构造参数); $对象名->成员属性=赋值; //对象属性赋值 echo $对象名->成员属性; //输出对象的属性 $对象名->成员方法(参数);//调用对象的方法 3.4 特殊的对象引用”$this” ™ 特殊对象的引用$this就是在对象内部的成员方法 中,代表本对象的一个引用,但只能在对象的成 员方法中使用,不管是在对象内部使用$this访问 自己对象内部成员。还是在对象外部通过对象的 引用名称访问对象中的成员,都需要使用特殊的 运算符“->”来完成访问。 3.5 构造方法与析构方法 ™ 构造函数: 大多数类都有一种称为构造函数的特殊方法。当创建 一个对象时,它将自动调用构造函数,通常用它执行一些 有用的初始化任务。 构造函数的声明与其它操作的声明一样,只是其名称 必须是两个下划线__construct( )。这是PHP5中的变化; PHP4的版本中,构造函数的名称必须与类名相同。为了向 下兼容,如果一个类中没有名为__construct( )的方法, PHP将搜索一个与类名相同的方法。 格式:function __construct ( [参数] ) { ... ... } ™ name="lisi"; $this->age=28; } function say(){ echo "my name is ".$this->name."
"; echo "my age is ".$this->age."
"; } } $per=new person(); $per->say(); $per->name="zhangsan"; $per->age=26; $per->say(); ™ ?> ™ 析构函数: 与构造函数相对的就是析构函数。析构函数是PHP5新添加 的内容,在PHP4中没有析构函数。析构函数允许在销毁一个 类之前执行的一些操作或完成一些功能,这些操作或功能通 常在所有对该类的引用都被重置或超出作用域时自动发生。 与构造函数的名称类似,一个类的析构函数名称必须是两 个下划线__destruct( )。析构函数不能带有任何参数。 例如: 四、 封装性 ™ 4.1 设置私用成员 ™ 4.2 私有成员的访问 ™ 4.3 __set()、__get()、__isset()和 __unset()四个方法 4.1 设置私用成员 ™ 类型的访问修饰符允许开发人员对类成员的访 问进行限制。 ™ 这是PHP5的新特性,但却是OOP语言的一个好 的特性。而且大多数OOP语言都已支持此特性。 PHP5支持如下3种访问修饰符: ¾ public (公有的 默认的) ¾ private (私有的) ¾ protected (受保护的) 一、public 公有修饰符: ™ 类的成员将没有访问限制,所有的外部成员都可 以访问(读和写)这个类成员。 注:在PHP5之前的所有版本中,类的成员都 是public的。 例:public $name; 二、private 私有修改符: ™ 被定义为private的成员,对于同一个类里的所有成 员是可见的,即是没有访问限制;但对于该类的外部 代码是不允许改变甚至读操作,对于该类的子类,也 不能访问 private修饰的成员。 例: private $var1 = ‘A’; //属性 private function getValue(){} //函数 三、protected保护成员修饰符: ● 被修饰为protected的成员不能被该类的外部代码访问。 但是对于该类的直接子类有访问权限,可以进行属性、方 法的读及写操作。 ● 被子类继承的protected成员,在子类外部同样不能被访 问 ● 注:在PHP5中如果类的成员没有指定成员访问修饰符,使 用var声明成员将被视为public 。 4.2 私有成员的访问 class person{ private $name="qq";//默认值 protected $age=20; public function getName(){ return $this->name; } public function setName($name){ $this->name= $name; } public function getAge(){ return $this->age; } public function setAge($age){ if($age>0 && $age<=100){ $this->age=$age; }else{ echo "年龄无效!"; } } … } 4.3 __set()、__get()、__isset()和__unset()四个方法 ™ 魔术方法: ¾ __set():用于替代通用的set的方法 ¾ __get(): 通用的get取值方法 ¾ __isset():检测成员属性是否存在 ¾ __unset():销毁成员属性 class person{ private $name="qq";//默认值 private $age=20; public function __set($pname,$pvalue){ if($pname=="age"){ if($pvalue<=0 || $pvalue>100){ echo "年龄赋值错误!";return; } } $this->$pname=$pvalue; } public function __get($pname){ return $this->$pname; } public function __isset($pname){ if($pname=="age"){//设置年龄属性不存在 return false; } return isset($this->$pname); } public function __unset($pname){ if($pname!="name") //屏蔽部分销毁。 unset($this->$pname); } } $p = new person(); $p->name="mm"; //相当与调用$p- >__set("name","mm"); $p->age=0; $p->say(); echo $p->age; //相当与调用$p->__get("age"); var_dump(isset($p->name)); unset($p->age); $p->say(); 五、继承性 ™ 5.1 类继承的应用 ™ 5.2 访问类型控制 ™ 5.3 子类中重载父类的方法 5.1 类继承的应用 ™ 如果类是另一个类的子类,可以用关键词" extends "来 指明其继承关系。如下代码创建了一个名为B的类,它继 承了在它前面定义的类A。 class A{ class B extends A{ public $num public $num2; function fun1(){ function fun2(){ }} }} ™ 如下所示的所有对类B对象的操作和属性的访问都是有效 的: $b=new B(); $b->$num1=10; $b->$num2=20; $b->fun1( ); $b->fun2( ); 类的继承 class Person { public $name; public $age; function getInfo(){...} } class Student { public $name; public $age; public $school; function getInfo(){...} function study(){...} } class Person { public $name; public $age; function getInfo(){...} } class Student extends Person { public $school; function study(){...} } 通过继承可以简化类的定义。 类的继承 PHP只支持单继承,不允许多重继承。一个子类只 能有一个父类,不允许一个类直接继承多个类,但一个类 可以被多个类继承。 可以有多层继承,即一个类可以继承某一个类的子 类,如类B 继承了类A,类C又继承了类B,那么类C也间接 继承了类A, class A {} class B extends A {} class C extends B {} 子类与父类的属性与方法 ¾ 子类继承父类的所有内容,但父类中的private 部分不能直接访问 ¾ 子类中新增加的属性和方法是对父类的扩展 ¾ 子类中定义的与父类同名的属性是对父类属性的 覆盖,同名的方法也是对父类方法的覆盖 5.2 访问类型控制 ™ 继承中访问权限: private protected public(默认的) --------------------------------------------------------------- 在同一类中: 可以 可以 可以 类的子类中: X 可以 可以 其他外部类中: X X 可以 5.3 子类中重载父类的方法 ™ 在子类里面允许重载(覆盖)父类的方法 ™ 在子类中,使用parent访问父类中的被覆盖的属 性和方法 ¾ parent::__construce(); ¾ parent::fun(); 六、常见的关键字和魔术方法 ™ 6.1 final关键字的应用 ™ 6.2 static和const关键字的使用 ™ 6.3 克隆对象 ™ 6.4 类中通用的方法__toString( ) ™ 6.5 通过__call( )方法处理错误调用 ™ 6.6 自动加载类 ™ 6.7 对象串行化 6.1 final关键字的应用 ™ 这个关键字只能用来定义类和定义方法, 不能使 用final这个关键字来定义成员属性,因为final 是常量的意思,我们在PHP里定义常量使用的是 define()函数和const关键字,所以不能使用 final来定义成员属性。 ™ final的特性 ¾ 使用final关键字标记的类不能被继承; ¾ 使用final关键字标记的方法不能被子类覆盖, 是最终版本; 6.2 static和const关键字的使用 ™ static关键字: ¾ PHP中使用static关键字来定义静态属性或方法 ¾ 在类内部,不能用this来引用静态变量或方法,而 需要用self来引用。 self::$静态属性、self::静态方法 ¾ 在类外部可以使用: 类::$静态属性、类::静态方法 const关键字 ™ const是一个定义常量的关键字,在PHP中定义常 量使用的是”define()”这个函数,但是在类里 面定义常量使用的是”const”这个关键字 ™ 用”const”修饰的成员属性的访问方式 和”static”修饰的成员访问的方式差不多,也 是使用”类名”,在方法里面使用”self”关键 字。但是不用使用”$”符号,也不能使用对象来 访问。 const CONSTANT = 'constant value'; echo self::CONSTANT;//类内部访问 echo ClassName::CONSTANT;//类外部访问 6.3 克隆对象 ™ 有时可能需要根据一个对象完全克隆出一个一模一样 的对象,而且克隆以后,两个对象互不干扰。 ™ 在PHP5中要创建一个对象的副本,使用关键字clone 来实现 $obj = new Class(); $objectcopy=clone $obj; 6.4 类中通用的方法__toString( ) ™ PHP提供一个__toString(),可以把类的实例转化 为字符串 class Person{ public $name; function __toString(){ return “This Person is ”.$name; } } $p=new Person(); $p->name=“Alex”; print($p); //输出This Person is Alex 6.5 通过__call( )方法处理错误调用 ™ 当试图调用一个对象中不存在的方法时,就会产 生错误。PHP提供了__call()这个方法来处理这种 情况。 //__call() function __call($function_name, $args) { print "你所调用的函数:$function_name(参数:"; print_r($args); //$args为参数数组 print (“)不存在!
\n“); } 6.6 自动加载类 ™ 在编写面向对象程序时,常规做法是将每一个类保存为一个PHP源文件。当在 一个PHP文件中需要调用一个类时很容易就可以找到,然后通过include把这 个文件引入就可以了。不过有的时候,在项目中文件众多,要一一将所需类 的文件include进来,是一个很让人头疼的事。 ™ PHP5提供了一个__autoload()来解决这个问题 在组织定义类的文件名时,需要按照一定的规则,最好以类名为中心,加上 统一的前缀或后缀形成文件名 class_student.php 或 student_class.php 或 student.php 6.7 对象串行化 ™ 有时候需要把一个对象在网络上传输,为了方便 传输,可以把整个对象转化为二进制串,等到达 另一端时,再还原为原来的对象,这个过程称之 为串行化。 ™ PHP使用serialize()函数来串行化一个对象,其 参数为对象名, 返回值为一个字符串 ™ serialize()返回的字符串含义模糊,一般也不会 解析这个串来得到对象的信息,而是使用 unserialize()函数来反串行化对象,这个函数的 参数即为serialize()的返回值,输出当然是重新 组织好的对象。 把对象串行化 ™ __sleep()和__wakeup() ™ PHP5中的对象串行化的时候,会调用一个 __sleep()方法来完成一些睡前的事情;而在重新 醒来,即由二进制串重新组成一个对象的时候, 刚会自动调用PHP的另一个函数__wakeup(),做一 些对象醒来就要做的动作。 ™ __sleep()函数不接受任何参数, 但返回一个数 组,其中包含需要串行化的属性。末被包含的属 性将在串行化时被忽略,如果没有__sleep()方 法,PHP将保存所有属性。 七、抽象类与接口 ™ 7.1 抽象方法和抽象类 ™ 7.2 接口技术 7.1 抽象方法和抽象类 ™ 在OOP语言中,一个类可以有一个或多个子类,而每 个类都有至少一个公有方法做为外部代码访问其的接 口。而抽象方法就是为了方便继承而引入的。 ™ 抽象方法是做为子类覆盖的模板使用的。 ™ 格式:abstract function 函数名; 如: abstract function 方法名( ); ™ 抽象方法的定义及继承覆盖示例: abstract class A_class{ abstract function getPicName( ); }//抽象类及抽象方法 class B_class extends A_class{ public function getPicName( ){ //覆盖抽象类的getPicName //方法代码体; } }//继承了抽象类并覆盖了抽象方法 ™ 抽象类不能被实例化,一个抽象类中可以包含 非抽象方法。 7.2 接口技术 ™ PHP与大多数面向对象编程语言一样,不支持多重继承, 也就是说每个类只能继承一个父类。为了解决这个这个问 题,PHP引入了接口,接口的思想是指定了一个实现了该 接口的类必须实现的一系列函数。 ™ 如果在一个抽象类中包含的只有抽象方法,可以将其定义 为interface(接口),用implements(实现)关键字使 用它。 interface 接口名{} class 类名 implements 接口名{ } 当一个类在继承了一个接口后,它必须实现即覆盖该接口 的所有方法 1、接口中只能声明常量属性,不能声明变量属性 interface A_class{ const PI=3.14; //public $a; this is error } 2、接口中的方法默认为抽象方法,必须定义为公有否则无 法继承: interface A_class{ public function getPicName(); //默认为public,可以省略 } 3、接口中的抽象方法可以声明为static 实现多个接口与接口间的继承 interface A{ function a();} interface B{ function b();} interface C extends A{ function c();} class D implements B,C{ function a(){} function b(){} function c(){} } //class D implements C,A this is error 抽象类与接口的区别 ™ 定义 ¾ 抽象类表示该类中可能已经有一些方法的具体 定义。 ¾ 接口就仅仅只能定义各个方法的界面,不能有 具体的实现代码在成员方法中。 ™ 用法 ¾ 抽象类是子类用来继承的,当父类已有实际功 能的方法时,该方法在子类中可以不必实现 ¾ 实现一个接口,必须实现接口中所有定义的方 法,不能遗漏任何一个。 八、多态性的应用 ™ 对象的多态性是指在父类中定义的属性或行为被 子类继承之后,可以具有不同的数据类型或表现 出不同的行为。这使得同一个属性或行为在父类 及其各个子类中具有不同的语义。 ™ 例如:"几何图形"的"绘图"方法,"椭圆"和"多边 形"都是"几何图"的子类,其"绘图"方法功能不同。 类的多态 ™ 所谓多态,即同一个方法,执行的结果不同。 ™ 利用可扩展的面向对象,在实际开发中减少很多逻辑控制 语句,实现多态的强大特性。 class A { function info(){ echo “A INFO”; } } class B extends A { function info(){ echo “B INFO”; } } class C extends A { function info(){ echo “C INFO”; } } function printinfo($obj){ function printinfo(A $obj){ if($obj instanceof A) $obj->info(); } } $a=new A(); $b=new B(); $c=new C(); printinfo($a); //输出A INFO printinfo($b); //输出B INFO printinfo($c); //输出C INFO 对象类型的检测-instanceof ™ instanceof操作符用于检测当前对象实例是否属 于某一个类的类型。 总结:面向对象 ™ 优点: ¾ 类将代码组织起来,使得代码更加清晰 ¾ 比较方便重复使用 ¾ 对象之间减少变量冲突,方便相关性数据的保存和使 用 ¾ 如果要解决的问题涉及多个方面,面向对象可以演化 出更加灵活和有技巧的方式,比如设计模式和框架 ™ 缺点 ¾ 代码量加大 ¾ 简单的任务如果定义很多类,反而麻烦 ¾ 对于简单的任务,面向对象使代码运行的效率降低 面向对象编程-OOP ™ 类和对象 ™ 构造和析构 ™ 静态 ™ 访问控制-封装 ™ 继承 ™ 重载 ™ 抽象类与接口 谢谢!

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档

相关文档