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