面向对象程序设计方法的主要思路是建立一系列类,并定义他们的静态属性和动态行为。
简而言之,面向对象思想的精髓包括以下内容:
1)、面向对象的系统是由对象组成的OBJECT
2)、把所有对象都划分成各种类Class ,每个类都定义了一组静态属性和动态方法。
3)、对象之间通过传递消息message互相联系,驱动整个系统的运营。
类是具有相同或相似结构、操作和约束规则的对象组成的集合。
对象是某一类的具体实例,每一个类都是具有某些共同特征对象的抽象。
类和对象的关系:
是抽象和具体的关系。
在构造类时,是要把一组数据和操作封装称为一体,可以把类理解为抽象数据类型。
类的属性和方法:
类的属性是客观世界实体性质的抽象,而方法是实体所能执行的操作。对象相互作用的机制是发送消息,一个消息由三部分组成:
1)、接收消息的对象:发送给谁
2)、消息名:需要对象做什么
3)、消息参数:提供对象方法所需的信息。例如,如果想使一个学生长大一岁,则可以对其发送消息、
S1->长大(1);
对于对象,它只提供了一些服务接口,而把现实细节对外界隐藏起来了,这称为封装。
封装的机制提高了对象的独立性,并确保只能通过向对象发送消息来改变对象,而不能直接到对象内部区改变他。
用继承来重用代码:
继承的本质是代码重用
简单说,继承是指一个类能够直接获得父类已有的性质或特征,而不必重复定义他们。很显然,继承具有传递性。
用多态来统一对外:
多台的本质:当通过传递消息使一个对象执行某个方法时,对象能根据所得到的参数决定调用哪个方法。
多态使对象有统一的对外接口,并可以根据不同的情况去做不同的动作。
实现多态性的重要方法是重载。重载的实现是对类中已有的同名方法重新定义,即在一个类中重复定义多个同名而不同参数的方法。
1.2.1 创建类和对象
类的创建需要完成其3个要素:类名、属性和方法。在PHP中,使用class关键字创建一个类。
Class classs_name
{
//属性
Var $var_1;
Var $var_2;
…
Var $var_m;
//方法
Function method_1(…){…}
Function method_2(…){…}
….
} //class_name
类的声明必须使用关键字class,其后面试类的名称class_name,然后是用一堆大括号{}来标识类的开始和结束。在类的内部包括以下两个部分:
1、 属性:用关键字var定义的属性
2、 方法:用关键字function定义类的方法。
调用属性和方法:
只需要”->”操作符就可以使用,其左边是类对象名,右边是属性或方法。
注意:若在类的内部的实现中使用类自身的属性和方法,需要在”->”属性或方法前加$this关键字,表明使用的事自身成员。而此时属性前不再有”$”.
在PHP中用关键字new来创建一个类的对象。
$object_name = new class_name;
例如:
Student_class.php
<?php /* * Created on 2009-11-16 * * To change the template for this generated file go to * Window - Preferences - PHPeclipse - PHP - Code Templates */ class student { //属性 var $no; var $name; var $gender; var $age;
//方法 function set_data($arr) { $this->no=$arr["no"]; $this->name=$arr["name"]; $this->gender=$arr["gender"]; $this->age=$$arr["age"] ; }
function grow($i) { $this->age+=$i; } function get_data() { echo "学生信息:"; echo $this->no; echo $this->name; echo $this->gender; echo $this->age; } }//class student
$s = new student; $temp_arr=array("no"=>"001","name"=>"孙海伟","age"=>"26","gender"=>"boy"); $s->set_data($temp_arr); $s->get_data(); $s->grow(1); $s->get_data();
?>
|
$this-> 表示使用类本身的属性。
1.2.2 使用构造函数
在PHP4以及以前的版本中,在类中创建与类同名的函数即为构造函数,构造函数可以带参数,也可以不带参数。
每实例化一个对象时都会执行这个函数。与类同名的函数。
<?php /* * Created on 2009-11-17 * * To change the template for this generated file go to * Window - Preferences - PHPeclipse - PHP - Code Templates */ class student{ var $no; var $name; var $gender; var $age;
function student($pname){ $this->name=$pname; } }//class student
$s1=new student("张三"); echo "学生姓名:".$s1->name."<br>"; $s2=new student("李四"); echo "学生姓名为: ".$s2->name."<br>"; ?> |
继承已有的类:
继承是面向对象的特征之一。在Php中使用extends关键字实现继承,这个和JAVA风格一致。
Class child_class extends parent_class
{
Var $new_property;
….
Function $new_method(){}
….
}
重载新的方法:
Function set_data($arr)
{
$this->no=$arr[“no”];
…
$this->department=$arr[“department”];
}
访问父类中的方法 :
Parent::
Function set_data($arr)
{
Parent::set_data($arr);
$this->department=$arr[“department”];
}
Function get_data()
{
Parent::get_data();
Echo “所在系:”.$this->department;
}
1、 控制访问权限
|-public 可以被毫无限制的访问,类外部的任何代码都可以读写public属性,
|-private 只在类的内部可见。类中的任何成员和类的实例都可以访问private成员。但在类的外面不能改变或读取privtate属性值,也不能调用private方法,所继承的子类也不能访问父类的private成员。
|-protected 能被同类中的所有方法和继承出的类的 所有方法访问,除此之外,不能被访问了。
<?php /* * Created on 2009-11-17 * * To change the template for this generated file go to * Window - Preferences - PHPeclipse - PHP - Code Templates */ class student{ private $no; private $name; private $gender; private $age;
private function show_age() { echo $this->age; }
public function ask_age() { $this->show_age(); }
function set_data($arr) { $this->no=$arr["no"]; $this->name=$arr["name"]; $this->gender=$arr["gender"]; $this->age=$arr["age"];
}
}
$s1= new student; $temp_arr=array("no"=>"002","name"=>"sdf","gender"=>"nv","age"=>23,"department"=>"物理系"); $s1->set_data($temp_arr); echo $s1->age; //error echo $s1->show_age(); //error $s1->ask_age(); ?>
|
一般,总是把类的属性定义为private,但是对于属性的读取非常频繁,php5中,预定义了__get()和__set()来获取和赋值其属性。
Function __get($property_name)
{
If(isset($this->property_name))
{ return $this->property_name; }
Else
{ return (NULL); }
}
Function __set($property_name,$value)
{
$this->property_name=$value;
}
2、 静态属性和方法
所于类的属性,而非对象的属性。在面向对象中,称之为静态属性。
Php中使用static关键字来定义静态属性和方法,但不能用this来引用静态变量或方法,而需要用self这个特殊的类。
对静态属性和方法,也不能再对象中用this来引用,在类内部引用,需要使用特殊的类self:: , 在类的外部引用,则需要类名+”::”。
3、 使用__construct和__destruct()
4、 使用__clone()克隆对象
5、 使用抽象方法和抽象类
6、 使用__call()处理调用错误
7、 使用__autoload() 自动加载类
8、 把对象串行化