面向对象是一种计算机编程架构,比面向过程编辑具有更强的灵活性和扩展性。苹果CEO乔布斯认为面向对象编程就是在与一个抽象的有生命的人在对话,高屋建瓴,细细品味确实如此。
一、 面向对象的基本概念
面向对象编程(OOP),是面向对象的一部分。面向对象包括3个部分:面向对象分析(Object
OrientedAnalysis,OOA)、面向对象设计(Object Oriented Design,OOD)、以及面向对象编程(Object
OrientedProgramming,OOP)。面向对象编程的两个重点概念是类和对象。
1. 类
世间万物都具有其自身的属性和方法,通过这些属性和方法可以将不同物质区分开来。例如,人具有身高,体重,以及肤色等属性,还可以进行吃饭、学习、走路等能
动活动,这些活动可以说是人具有的功能。可以把人看作程序中的一个类,那么人的身高可以比作类中的属性,走路可以比作类中的方法。也就是说,类是属性和方
法的集合,是面向对象编程方式的核心和基础,通过类可以将零散的用于实现某项功能的代码进行有效管理。
2. 对象
类只是具备某项功能的抽象模型,实际应用中还需要对类进行实例化,这样就引入了对象的概念。对象是类进行实例化后的产物,是一个实体。仍然以人为例,“黄种
人是人”这句话没有错误,但过来说,”人是黄种人”这句话一定是错误的。因为除了有黄种人,还有黑人、白人等。那么“黄种人”就是“人”这个类的一个实例
对象。可以就样理解对象和类的关系:对象实际上就是“有血有肉的、能摸得到看得到的“一个类。
3. 面向对象编程的三大特点
1) 封闭性
封闭性,也可以称为信息隐藏。就是将一个类的使用和实现分开,只保留有限的接口(方法)与外部联系。对于用到该类的开发人员,只要知道这个类如何使用即可,
而不用去关心这个类是如何实现的。这样做可以让开发人员更好地把精力集中起来专注别的事情,同时也避免了程序之间的相互依赖而带来的不便。
2) 继承性
继承性就是派生类(子类)自动继承一个或多个基类(父类)中的属性与方法,并可以重写或添加新的属性和方法。继承这个特性简化了对象和类的创建,增加了代码的可重性。继承分单继承和多继承,PHP所支持的是单继承,也就是说,一个子类有且只有一个父类。
3) 多态性
多态性是指同一个类的不同对象,使用同一个方法可以获得不同的结果,这种技术称为多态性。多态性增强了软件的灵活性和重用性。
二、面向对象的特性
1. 类的定义
和很多面向对象的语言一样,PHP也是通过class关键字加类名来定义类的。类的格式如下:
如上述People就是一个最简单的类了,上述两个大括号中间的部分是类的全部内容,People类仅有一个类的骨架,什么功能都没有实现,但这并不影响它的存在。
注意:类名的首字母必须大写
2. 成员方法
类中的函数被称为成员方法。函数和成员方法唯一的区别就是,函数实现的是某个独立的功能,而成员方法是实现类中的一个行为,是类的一部分。
下面就来扩充上面的People类,为它添加一个成员方法,代码如下:
-
<?php
-
class People{
-
function get_name($name)
-
{
-
echo "人的名字是:".$name;
-
}
-
}
-
?>
该方法的作用是输出对象的名称,对象名称是通过方法的参数传进来的。
3. 类的实例化
类的方法已经添加进去了,接下来就是使用方法,但使用方法不像使用函数那么简单。首先要对类进行实例化,实例化是通过关键字new来声明一个对象。然后使用如下格式来调用要使用的方法:
“对象名->成员方法”
类是一个抽象的描述,是功能相似的一组对象的集合。如果想用到类中的方法和变量,首先就要把它具体落实到一个实体,也就是对象上。
-
<?php
-
class People{
-
function get_name($name){
-
echo "人的名字是:".$name;
-
}
-
$people = new People(); //实例化对象
-
$people->get_name("Bob"); //调用get_name方法
-
}
-
?>
4. 成员变量
类中的变量,也称为成员变量(也有称为属性或字段的)。成员变量用来保存信息数据,或与成员方法进行交互来实现某功能。定义成员变量的格式为:
关键字 成员变量名
关键字可以使用public、private、protected、static和final中的任意一个。
访问成员变量和访问成员方法是一样的。只要把成员方法换成成员变量即可,格式为:
对象名->成员变量。
-
<?php
-
class People{
-
public $name; //定义name属性
-
function set_name($name){ //声明成员方法
-
$this->name = $name;
-
}
-
function get_name(){ //声明成员方法
-
return $this->name;
-
}
-
$people = new People(); //实例化对象
-
$people->set_name("Bob"); //调用get_name方法
-
echo $people->get_name();
-
}
注:$this->作用是用来调用本类中的成员变量或成员方法,只能在本类中使用,相当于self
5. 类常量
既然有变量,当然也会有常量了。常量就是不会改变的量,是一个恒值。众所周知的一个常量就是圆周率Pi。定义常量使用关键字const如:
ConstPI=3.14159;
-
<?php
-
class People{
-
const count_people = 0; //声明一个常量
-
public $name; //定义name属性
-
function set_name($name){ //声明成员方法
-
self::count_pepple++; //在成员方法中调用常量
-
$this->name = $name;
-
}
-
function get_name(){ //声明成员方法
-
return $this->name;
-
}
-
$people = new People(); //实例化对象
-
$people->set_name("Bob"); //调用get_name方法
-
echo $people->get_name();
-
People::count_people++ ;//
-
}
可以看出常量和变量的输出是不一样。常量不需要实例化对象,直接由类名+常量名调用即可。常量输出的格式为:
类名::常量名; 在成员方法中,可以使用self调用。
类名和常量名之间的两个冒号称为作用域操作符,使用这个操作符可以在不创建对象的情况下调用类的常量、变量和方法。
6. 构造方法和析构方法
1) 构造方法
当一个类实例化一个对象时,可能会随着对象初始化一些成员变量。
__construect([mixed args,[……]])
注:函数中的__是两条下划线,不是一条。
-
<?php
-
class People{
-
public $name; //定义name属性
-
function __construct($name,$age,$sex)
-
{
-
$this->name = $name ;
-
$this->age = $age ;
-
$this->sex = $age ;
-
}
-
function set_name($name){ //声明成员方法
-
self::count_pepple++; //在成员方法中调用常量
-
$this->name = $name;
-
}
-
function get_name(){ //声明成员方法
-
return $this->name;
-
}
-
$people1 = new People('Bob','15','man'); //实例化对象
-
$people2 = new People('Alice','16','woman'); //实例化对象
-
echo $people1->get_name();
-
echo "
";
-
echo $people2->get_name();
-
}
构造方法是初始化对象时使用的。如果类中没有构造方法,那么PHP会自动生成一个。自动生成的构造方法没有任何参数,没有任何操作。
注:php中类的构造方法只能有一个,不同于java中可以声明多个构造方法。
2) 析构方法
析构方法的作用和构造方法正好相反,是对象被销毁时被调用的,作用是释放内存。析构方法的格式为:
Void __destruct(){}
-
<?php
-
class People{
-
public $name; //定义name属性
-
function __construct($name,$age,$sex)
-
{
-
$this->name = $name ;
-
$this->age = $age ;
-
$this->sex = $age ;
-
}
-
function set_name($name){ //声明成员方法
-
self::count_pepple++; //在成员方法中调用常量
-
$this->name = $name;
-
}
-
function get_name(){ //声明成员方法
-
return $this->name;
-
}
-
function __destruct() //声明析构函数
-
{
-
echo "对象被销毁时调用" ;
-
}
-
$people1 = new People('Bob','15','man'); //实例化对象
-
$people2 = new People('Alice','16','woman'); //实例化对象
-
echo $people1->get_name();
-
echo "
";
-
echo $people2->get_name();
-
}
PHP使用的是一种“垃圾回收”机制,自动清除不再使用的对象,释放内存。就是说即使不使用unset函数,析构方法也会自动被调用,这里只是明确一下析构函数在何时被调用。一般情况下是不需要手动创建析构方法的。析构函数没有参数。
7. 继承和多态的实现
People 的某些属性是共同的,比如,他们都有姓名,会走、会跳、能说话等,但也用一些自我属性,比如,性别、身高、体重等,这时可以使用面向对象中的继承来解决这个难题。
在PHP中实现继承是通过关键字extends来声明的,继承格式如下:
-
<?php
-
class Man extends People{
-
}
-
?>
说明:Man为子类的名称,People为父类名称。
-
<?php
-
class People{
-
public $name; //定义name属性
-
function __construct($name,$age,$sex)
-
{
-
$this->name = $name ;
-
$this->age = $age ;
-
$this->sex = $age ;
-
}
-
function set_name($name){ //声明成员方法
-
self::count_pepple++; //在成员方法中调用常量
-
$this->name = $name;
-
}
-
function get_name(){ //声明成员方法
-
return $this->name;
-
}
-
function show_atr() //声明
-
{
-
echo "显示属性" ;
-
}
-
class Man extends People{ //子类man
-
function __construct($height,$weight){
-
parent::__construct();
-
$this->height = $height;
-
$this->weight = $weight ;
-
}
-
-
function show_atr() //子类重构方法
-
{
-
echo "姓名:".$this->name.<br>."年龄" .$this->age."<br>"."性别".$this->sex."<br>"."身高".$this->height."<br>"."体重".$this-weight ;
-
}
-
}
-
-
class Women extends People{ //子类women方法
-
function __construct(){
-
parent::__construct();
-
}
-
function show_atr() //子类重构方法
-
{
-
echo "姓名:".$this->name."<br>"."年龄" .$this->age."<br>"."性别".$this->sex;
-
}
-
}
-
}
-
$p1 = new People('Bob','19','man');
-
$p1->show_atr();
-
$p2 = new Man('kobran','20','man','190','140');
-
$p2->show_atr();
-
$p3 = new Woman('Julice','22','woman','170','60');
-
$p3->show_atr();
-
子类继承了父类的所有成员变量和方法,包括构造函数。这就是继承的实现。
当子类被创建时,PHP会先在子类中查找构造方法。如果子类有自己的构造方法,PHP会先调用子类中的方法,当子类中没有时,PHP则会去调用父类中的构造方法.