PHP学习笔记之面向对象设计
维护简单 模块化是面向对象编程中的一个特征。实体被表示为类和同一名字空间中具有相同功能的类,我们可以在名字空间中添加一个类而不会影响该名字空间的其他成员。
可扩充性 面向对象编程从本质上支持扩充性。如果有一个具有某种功能的类,就可以很快地扩充这个类,创建一个具有扩充的功能的类。
代码重用 由于功能是被封装在类中的,并且类是作为一个独立实体而存在的,提供一个类库就非常简单了。
它比较适合多人合作来开发项目,所以现在很多大中型网站都选择了用OOP来开发。
本文主要讲解了用php做面向对象编程的最基本的方法和代码实例,如何创建一个class和如何生成一个class的实例等等,只是一个入门,非常的简单,要想深学这点是远远不够的。只适合php的初学者
public 表示全局,类内部外部子类都可以访问;
代码如下 | 复制代码 |
class Test{ public $name='Janking', $sex='male', $age=23; function __construct(){ echo $this->age.' '.$this->name.' '.$this->sex.' '; } function func(){ echo $this->age.' '.$this->name.' '.$this->sex.' '; } } $P=new Test(); echo ' '; $P->age=100; $P->name="Rainy"; $P->sex="female"; $P->func(); ?> |
private表示私有的,只有本类内部可以使用;
代码如下 | 复制代码 |
|
protected表示受保护的,只有本类或子类或父类中可以访问;
- 数据抽象和信息隐藏
- 继承
- 多态性
在PHP中使用类进行封装的办法:
代码如下 | 复制代码 |
class Something { function setX($v) { function getX() { ?>
|
当然你可以用你自己的办法,但有一个标准总是好的。
PHP中类的数据成员使用 "var" 定义,数据成员是没有类型直到被赋值。一个数据成员可能是一个 integer、数组、联合数组(associative array)或甚至对象(object). 方法在类里定义成函数,在方法里存取数据成员,你必须使用$this->name 这样的办法,否则对方法来说是一个函数的局部变量。
使用 new 来创建一个对象
代码如下 | 复制代码 |
$obj = new Something; |
然后使用成员函数
代码如下 | 复制代码 |
$obj->setX(5); |
setX 成员函数将 5 赋给对象(而不是类)obj 中成员变量, 然后 getX 返回值 5.
你也可以用对象引用来存取成员变量,例如:$obj->x=6; 然而,这不一种好的面向对象编程的方法。我坚持你应使用成员函数来设置成员变量的值和通过成员函数来读取成员变量。如果你认为成员变量是不可存取的除了使用成员函数的办法,你将成为一个好的面向对象程序员。 但不幸的是PHP本身没有办法声明一个变量是私有的,所以允许糟糕的代码存在。
在 PHP 中继承使用 extend 来声明。
代码如下 | 复制代码 |
class Another extends Something { function getY() { ?>
|
这样类 "Another" 的对象拥有父类的所用成员变量及方法函数,再加上自己的成员变量及成员函数。如:
代码如下 | 复制代码 |
$obj2=new Another; |
多重继承不被支持,所以你不能让一个类继承多个类。
在继承类中你可以重新定义来重定义方法,如果我们在 "Another" 重新定义 getX,那么我们不再能存取 "Something" 中的成员函数 getX. 同样,如果我们在继承类中声明一个和父类同名的成员变量,那么继承类的变量将隐藏父类的同名变量。
你可以定义一个类的构造函数, 构造函数是和类同名的成员函数,在你创建类的对象时被调用。
代码如下 | 复制代码 |
class Something { function Something($y) { function setX($v) { function getX() { ?>
|
所以可以用如下方法创建对象:
代码如下 | 复制代码 |
$obj=new Something(6); |
构造函数自动赋值 5 给成员变量 x, 构造函数和成员函数都是普通的PHP函数,所以你可以使用缺省参数。
代码如下 | 复制代码 |
function Something($x="3",$y="5") |
然后:
代码如下 | 复制代码 |
$obj=new Something(); // x=3 and y=5 |
缺省参数的定义方法和 C++ 一样,因此你不能传一个值给 Y 但让 X 取缺省值,实参的传递是从左到右,当没有更多的实参时函数将使用缺省参数。
只有当继承类的构造函数被调用后,继承类的对象才被创建,父类的构造函数没有被调用,这是PHP不同其他面向对象语言的特点,因为构造函数调用链是面向对象编程的特点。如果你想调用基类的构造函数,你不得不在继承类的构造函数中显式调用它。这样它能工作是因为在继承类中父类的方法全部可用。
代码如下 | 复制代码 |
function Another() { |
?>
多态性。
代码如下 | 复制代码 |
function niceDrawing($x) { $obj=new Circle(3,187); $board->niceDrawing($obj); //will call the draw method of Circle. |
?>
和封装有关的魔术方法:
__set():是直接设置私有成员属性值时,自动调用的方法
__get():是直接获取私有成员属性值时,自动调用的方法
__isset(); 是直接isset查看对象中私有属性是否存时自动调用这个方法
__unset(); 是直接unset删除对象中私有属性时,自动调用的方法