和一些面向对象的语言有所不同,PHP并不是一种纯面向对象的语言,包PIP它支持面向对象的程序设计,并可以用于开发大型的商业程序。因此学好面向对象输程对PHP程序员来说也是至关重要的。本章并针对面向对象编程在PIP语言中的使用进行详细讲解。
2.1 面向对象概述
面向对象是一种符合人类思维习惯的编程思想。现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象。
提到面向对象,自然会想到面向过程,面向过程就是分析解决问题所需要的步骤,然后用函数把这些步骤一一实现。使用的时候一一个个依次调用就可以了。面向对象则是把解决的问题按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。当然,一个应用程序会包含多个对象,通过多个对象的相互配合来实现应用程序的功能。这样当应用程序功能发生变动时,只需要修改个别的对象就可以了,从而使代码更容易维护。面向对象的特点主要可以概括为封装性、继承性和多态性。接下来针对这三种特性进行简单介绍。
1. 封装性
封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体实现细节,这就是封装思想。例如,用户使用计算机,只需要使用手指蔽键盘就可以了,无领知道计算机内部是如何工作的,即使用户可能碳巧知道计算机的工作原理。但在使用时。也不会完全依赖计算机工作原理这些细节。
2.继承性
继承性主要描述的是类与类之间的关系,通过继承,可以在无须重新编写原有类的情况下,对原有类的功能进行扩展。例如,有一个汽车的类,该类中描述了汽车的普通特性和功能,面轿车的类中不仅应该包含汽车的特性和功能,还应该增加轿车特有的功能,这时。可
以让轿车类继承汽车类、在轿车类中单独漆加轿车特性的方法就可以了,继承不仅增强了代码的复用性 提高了程序开发效率而且为程序的修改补充提供了便利。
3.多态性
多态性指的是同一操作作用于不同的对象,会产生不同的执行结果。例如当听到Cout这个单词时,理发师的表现是剪发演员的行为表现是表演, 不同的对象,所表现的行为是不一样的
面向对象的编程思想博大精深,初学者仅仅靠文字介绍是不能完全理解的,必须通过大量的实践和思考,才能真正领悟。希望大家带着面向对象的思想来学习后续的课程,来不断加深对面向对象的理解
2.2 类与对象
面向对象的编星思想力图使程序对事物的描述与该事物在现实中的形态保持一致。为了做到这一点,在面向对象的思想中提出了两个概 即类和对象。其中,类是对某类事物的拍象描述,而对象用于表示现实中该类事物的个体。
class 类名{ 成员属性; 成员方法; }
接下来通过一个案例来演示如何定义个类, 如例2-1所示。
<?php //定义一个Person类 class Person { public $name; public $age; public function speak(){ echo "大家好!我叫".$this->name.",今年".$this->age."岁。<br>"; } } ?>
例2-1中定义了一个类。其中,Person是类名,name和age是成员属性,speak()是成员方法。在成员方法spcak()中可以使用$this访向成员属性name和age.需要注意的是。 $this表示当前对象,这里是指Person类实例化后的具体对象。
2.2.2对象的创建
应用程序想要完成具体的功能,仅有类是远远不够的,还需要根据类创建实例对象。在PHP程序中可以使用NEW关键字来创建对象,具体格式如下:
$对象名=new类名([ 参数1,.参数2]);
上述语法格式中。“$对象名”表示一个对象的引用名称,通过这个引用就可以访问对象中的成员,其中$符号是固定写法,对象名是自定义的。new表示要创建一个新的对象。类名”表示新对象的类型。“[参数1.参数2]"中的参数是可选的。对象创建成功后。就可以通过“对象一>成员”的方式来访问类中的成员。名要注意的是,如果在创建对象时,不需要传递参数。则可以省路类名后面的括号,即“new类名:”。
接下来通过一个案例来演示如何创建Person类的实例对象。如例2-2所示
例2-2
<?php //定义一个Person类 class Person { public $name; public $age; public function speak(){ echo "大家好!我叫".$this->name.",今年".$this->age."岁。<br>"; } } $p1=new Person(); $p1->name = "张华"; $p1->age = 10; $p1->speak(); ?>
运行结果
在例2-2中,定义了一个Person对象$pl.然后通过该对象为name和age属性赋值,井调用speak()方法。从运行结果可以看出,程序输出了$p1对象的姓名和年龄。
2.2.3类的封装
在例2-2中定义的Person类有两个属性 name和age.在为age赋值时。由于没有做限定,因此可以赋于任何值,甚至一个负数。然面,将年龄赋值为一个负数显然是不符合实际生活的为了防止这种情况出现,在设计一个类时,应该对成员交量的访问做出一些限定.不允许外界随意访问,此时就需要实现类的封装。
所谓类的封装是指在定又一个类时将类中的属性私有化,即使用pnvate关键字来修饰。私有化的属性只能在它所在类中技访问,为了能让外界访问私有属性。PHP提供了两种形式,接下来将针对这两种形式进行详细讲解
通过getxx()和setXxx()方法访问私有属性
在PHP程序中,为了可以访问私有属性。可以手动编写公有的geXxx()和setXxx()方法,其中,geXxx()方法用于获取属性值,setXxx()方法用于设置属性值。 接下来通过一个案例来演示这两个方法的使用,如例2-3所示
例2-3
<?php class Person { private $name; private $age; //定义getName()和setName()方法用于获取和设置$name属性 public function getName() { return $this->name; } public function setName($value) { $this->name=$value; } //定义getAge()和setAge()方法用于获取和设置$age属性 public function getAge() { return $this->age; } public function setAge($value) { if($value<0){ echo "年龄不合法<br>"; }else{ $this->age=$value; } } } $p1=new Person(); $p1->setName("张华"); $p1->setAge(-10); echo "姓名:".$p1->getName()."<br>"; echo "年龄:".$p1->getAge(); ?>
运行结果
在例2-3的Person类中,使用prvate关键字将属性name和sge声明为私有,并对外界提供了公有的方法.其中getName()方法用于获取name属性的值.setName()方法用于设置name属性的值,同理,getAge()和 setAge()方法用于获取和设置age属性的值。在创建Person对象时。调用setAge()方法传入一个负数-10,在selAge()方法中对参数$value的值进行检查、由于当前传人的值小于0.因此会打印“年龄不合法”的信息,ase属性不会被赋值。
通过_ _get()和_ _ set ()方法访问私有属性
上述形式在实现封装时,获取属性使用的都是手动编写的getXxx()和setXxx()方法,当一个类中有多个属性时,使用这种方式就会很麻烦。为此,PHP5中预定义了_ get()方法和_ set()方法其中get()方法 用于获取私有成员属性的属性值,set()方法用于为私有成员属性赋值,这个两个方法获取私有属性和设置私有属性时都是自动调用的 接下来通过一个案例2-4来演示这个方法的使用。
例2-4
<?php class Person { private $name; //将$name属性封装 private $age; //将$age属性封装 //定义__get()方法用于获取Person的属性 public function __get($property_name){ echo "自动调用__get()方法获取属性值<br>"; if(isset($this->$property_name)){ return($this->$property_name); }else{ return(NULL); } } //定义__set()方法用于设置Person的属性 public function __set($property_name,$value){ echo "自动调用__set()方法为属性赋值<br>"; $this->$property_name=$value; } } $p1=new Person(); $p1->name = "张华"; $p1->age = 10; echo "姓名:".$p1->name."<br>"; echo "年龄:".$p1->age; ?>
运行结果
在PHP中,提供了三个访问修饰符public. protected 和pnvate.它们可以对类中成员的访问作出一些限制,具体如下:
public:公有修饰符,类中的成员将没有访问限制,所有的外部成员都可以访问这个类的成员。如果类的成员没有指定访问修饰符,则默认为public.
protected: 保护成员修饰符,被修饰为protected 的成员不能被该类的外部代码访问,但是对于该类的子关可以对其访问、读写等。
pnvate: 私有修饰符,被定义为private 的成员,对于同一个关里的所有成员是可见的,即没有访问限制,但不允许该类外部的代码访问,对于该类的子类同样也不能访问。
需要注意的是,在PHP4中所有的属性都用关键字var声明,它的使用效果和使用public一样。因为考虑到向下兼容,PHPS 中保留了对var的支持。但会将var自动转换为pubic.
2.2.4 特殊的$this
$this->属性名;
为了更好地理解$this的用法.接下来通过一个案例来演示如何使用$this访问对象内部的成员属性,如例2-5所示
1 <?php 2 //定义一个Person类 3 class Person { 4 public $name; 5 public $age; 6 public function speak(){ 7 echo "大家好!我叫".$this->name.",今年".$this->age."岁。<br>"; 8 } 9 } 10 $p1=new Person(); 11 $p1->name = "张华"; 12 $p1->age = 10; 13 $p1->speak(); 14 $p2=new Person(); 15 $p2->name = "紫晴"; 16 $p2->age = 13; 17 $p2->speak(); 18 ?>
运行结果
在例2-5中.创建了Person类的两个实例对象$pI .$p2.然后通过这两个对象分别为name、age属性赋值,并调用speak()方法。从运行结果可以看出,当$p1 对象调用speak()方法时,会输出$pI对象的属性值,当$p2 对象调用speak()方法时,会输出$p2对象的属性值。因此,可以说明$this表示的是当前类的当前对象。
注意: $this 不能在类定义的外部使用,只能在类定义的方法中使用。$this在静态方法中不能使用 ,静态方法中也不应调用非静态方法。