[TOC]
本节介绍面向对象编程的主要概述,并探索这些概念之间如何交互;第3章将深入讨论这些概念在PHP6中的实现细节。本间涵盖了以下主题:
* 类(Class)
* 对象(Object)
* 继承(Inheritance)
* 多态(Polymorphism)
* 接口(Interface)
* 封装(Encapsulation)
# 1.3 类
类是一个代码单元(由变量和函数组成),该代码单元描述了集合中所有成员的特征和行为。
## 1.3.1 对象
类可以看成是构造对象的蓝本。
类永远不能有导发值 或状态,只有对象才可以值或状态。
在实例化,就可以将对象用于实现应用程序的业务需求。
### 1. 创建类
```
<?php
class Demo{
}
```
实例化一个对象
```
<?php
require_once('class.Demo.php');
$objDemo = new Demo();
```
### 2.添加方法
```
<?php
class Demo{
function sayHello($name){
print "Hello $name";
}
}
```
使用 `->` 来访问新创建的函数:
```
<?php
require_once('class.Demo.php');
$objDemo = new Demo();
$objDemo->sayHello('Steve');
```
>PHP在其OO语法中根本不使用点操作(.)
### 3.添加属性
在面向过程代码中,当希望存储某个值 时,会将该值赋给一个`变量`。
在OOP中,当希望存储某个属性的值时,也可以使用一个`变量`。
该变量在类声明的顶部声明,`类声明位于包含类代码的大括号中`。
变量的名称就是属性的名称!
声明使用`public $property`,使用`$obj->property`来访问。
```
<?php
class Demo{
public $name;
function sayHello(){
print "Hello $this->name!";
}
}
```
使用
```
<?php
require_once('class.Demo.php');
$objDemo = new Demo();
$objDemo->name='Steve';
$objAnotherDemo = new Demo();
$objAnotherDemo->name='Ed';
$objDemo->sayHello();
$objAnotherDemo->sayHello();
```
访问该文件,字符串`Hello Steve!Hello Ed!`就出现在屏幕上!
### 4.保护对成员变量的访问
正如前面的示例所示,可以将 name 属性的值设置为任意所需要的数据——包括对象、整数数组、文件句柄或任何其他没有意义的值 。但是,并不能在设置name属性时执行任何形式的数据验证或更新其他的值 。
为了解决该问题,必须以 `get[property name]` 和 `set[property name]`的函数形式来实现属性。这些函数称为`存储器方法`,下面的示例演示了这些方法。
```
<?php
class Demo{
private $_name;
public function sayHello(){
print "Hello ".$this->getName()."!";
}
public function getName(){
return $this->_name;
}
public function setName($name){
if(!is_string($name) || strlen($name) == 0){
throw new Exception("Invalid name value!");
}
$this->_name = $name;
}
}
```
使用类
```
<?php
require_once('class.Demo.php');
$objDemo = new Demo();
$objDemo->setName('Steve');
$objDemo->sayHello();
$objDemo->setName(37); //would trigger an error
```
>name属性的成员访问级别已经由 public 变成了 private。下划线是建议的命名约定!
### 5. 初始化对象
对于许多将要创建的类,需要在初次实例化该类的对象时执行一些特殊的设置。例如,可能需要从数据库中获取某些信息,或者是初始化某些属性值 。通过创建一个`构造函数`的特殊方法可以执行实例化对象所需要的任何活动,该方法在PHP中是通过名为`_construct()`的函数来实现的。在实例化对象是时,PHP将自动调用这个特殊的函数。
### 6.销毁对象
当请求的页面已经完成运行,或者创建的对象变量已经不在其作用域内,又或者变量被显式地设置为 null 时,都需要从内存中移除该变量。
在PHP6中,可以在销毁对象之前做一些处理工作,并且在销毁发生时采取相应的操作。
为了实现这一点,创建一个不带参数的、名为`__destruct`的函数。在销毁对象之前就会自动调用该函数,前提是该函数存在!
## 1.3.2 继承
利用继承机制, 我们可以定义一个基类!
### 1. 重写方法
重新写方法以覆盖方法
### 2. 保留父类的功能
可以采用 `parent::[function name]` 这一关键字!
如:
```
parent::__contruct($customerID);
```
### 3. 继承的工作原理
书中采用 `某一个变量的true和false` 的形式,以继承不同的类!
## 1.3.3 接口
### 1. 接口的功能
接口可以指定某个对象能够执行某种函数,但是它并不需要表明如何执行该函数。
接口是不相关的对象之间为了执行共有的函数而建立 起来的合同。
### 2. 接口的工作原理
书中用实例来表示,有意者可看 25、26页。
## 1.3.4 封装
书中讲的其实就是业务的一些封装!