11.1 PHP面向对象基础
面向对象程序设计的诞生,为开发程序的方法带来了极大的改变,使编程的注意力重新从应用程序的逻辑回到其数据上来,这样易于编程人员对程序的模块化开发及日后对程序的维护和修改。
实例293

数据成员的初始化
实例说明

PHP中对数据成员初始化主要有两种方法,第一种方法是在类中指定的方法中为数据成员赋初值,从而达到数据成员初始化的目的,第二种方法是利用构造函数对数据成员初始化。在实际项目开发过程中,最常用的还是第二种方法。在PHP 5.0以前的版本中构造函数是指类体中与类名相同的函数,在PHP 5.0以后的版本中构造函数名称为__construct(),当然也兼容PHP 5.0以前版本中构造函数的定义方法。本实例主要介绍PHP 5.0以后版本对类中数据成员初始化的方法。运行本实例,如图11.1所示,在密码验证表单中,如果输入正确的用户名和密码则提示登录成功。本实例将通过面向对象的方式实现用户身份的验证。
技术要点
面向对象的编程过程中,利用构造函数对类中的数据成员初始化具有以下优点:
(1)构造函数可以接收参数,能够在创建对象时为指定对象赋初值。
(2)构造函数可以调用类中的方法。
(3)构造函数可以调用其他类的构造函数,包括父类的构造函数。
PHP 5.0以后的版本中构造函数名称为__construct()。声明构造函数的语法格式如下:
function __construct([arg1,arg2,arg3…])
{
//对数据成员初始化
}

注意:__construct()函数名前为双下划线。
实现过程
(1)建立如图11.1所示的登录表单。
(2)为了节省浏览器资源,判断用户是否填写了用户名和密码,可以在前台通过JavaScript实现。代码如下:
<script language="javascript">
function chkiput(form)
{
if(form.name.value=="")
{
alert("请输入用户名!");
form.name.select();
return(false);
}
if(form.pwd.value=="")
{
alert("请输入用户密码!");
form.pwd.select();
return(false);
}
return(true);
}
</script>
(3)通过密码验证类对用户输入的用户名和密码进行验证。代码如下:
<?php
if($_POST[submit]!="")
{
class chkinput
{
private $name;
private $pwd;
function __construct($x,$y) //实现数据成员初始化
{
$this->name=$x;
$this->pwd=$y;
}
function checkinput()
{
if($this->name=="mr" &&$this->pwd=="mrsoft")
{
echo "<br><div align=center>恭喜您,登录成功!</div>";
}
else
{
echo "<br><div align=center>对不起,密码输入错误!</div>";
}
}
}
$obj=new chkinput($name=$_POST[name],$pwd=$_POST[pwd]);
$obj->checkinput();
?>
举一反三
根据本实例,读者可以:

实现数据信息添加类。

实现数据信息检索类。
实例294

父类构造函数的调用
实例说明
PHP在面向对象的编程过程中,可以通过继承来实现类之间的通信,但PHP不会自动调用父类的构造函数,必须使用parent关键字间接地调用。运行本实例,如图11.2所示,在页面中输出的字符串“mingrisoft”是通过子类为父类构造函数进行初始化而传递到父类的。
图11.2 父类构造函数的调用
技术要点
PHP中可以通过关键字extends实现类的继承,子类可以无条件地使用父类的数据成员和成员函数,但子类却不能直接通过调用父类的构造函数为父类的数据成员进行初始化。必须通过关键字parent实现。例如,可以按如下格式实现父类构造函数的初始化:
public function __construct(参数1,参数2……) //子类构造函数
{
parent::__construct(参数1,参数2……); //父类构造函数
}
实现过程
(1)建立父类father。代码如下:
class father
{
private $m;
public function __construct($x)
{
$this->m=$x;
}
public function father_function()
{
echo "父类成员函数的输出结果:".$this->m;
}
}
(2)建立子类child。代码如下:
class child extends father
{
public function __construct($x)
{
parent::__construct($x);
}
}
(3)对子类进行实例化,并调用父类的成员函数father_function()。代码如下:
$obj=new child("mingrisoft");
$obj->father_function();
举一反三
根据本实例,读者可以:

翻页类中父类构造函数的调用。

数据库连接类中构造函数的调用。
实例295

对象的克隆
实例说明

PHP在采用面向对象编程过程中,经常需要使用具有相同特征的两个类,建立两个完全一样的类当然可以实现所需的功能,但这会大大降低代码的重用率,并且会使整个程序的开发效率大大降低,为了改进上述缺陷,PHP可以采用克隆机制完成两个相同类的创建。
运行本实例,如图11.3所示,在程序执行结果中可以看出原对象和克隆后产生的对象,如果都调用同一类中的成员函数,则会输出相同的结果或实现相同的功能。
技术要点
PHP中实现对象克隆可以利用关键字clone实现。
关键字clone的使用方法:
新对象=clone 原对象

说明:利用该关键字可以使新对象和原来的对象具有相同的特征。
实现过程
(1)建立类testclone。代码如下:
class testclone
{
private $m;
public function __construct($x)
{
$this->m=$x;
}
public function print_content()
{
echo $this->m."<br>";
}
}
(2)对类testclone进行实例化。代码如下:
$obj1=new testclone("mrsoft");
(3)利用关键字clone实现类的克隆。代码如下:
$obj2=clone $obj1;
举一反三
根据本实例,读者可以:

实现翻页类的克隆。

实现收邮件类的克隆。
实例296

类的继承
实例说明

在现实生活中,人们习惯按有组织的层次关系思考问题,例如公司的管理结构就是这样的一种关系。类的继承就采用了这种层次关系,子类可以使用任何父类中用关键字public或private声明的数据成员和成员函数。
运行本实例,如图11.4所示,本实例只创建一个对象,但却通过类的继承的方式,分别调用了该类本身的成员函数和父类的成员函数。图11.4中的第一行所打印出的内容是通过调用该类本身实现的,而第二行输出的内容是通过调用父类的成员函数实现的。
技术要点
与其他面向对象的计算机语言类似,PHP也是通过关键字extends实现类的继承的。实现类的继承的语法格式如下:
class 子类名 extends 父类名
{
// 子类的数据成员;
// 子类的成员函数;
}
通过上述方式即可实现类的继承,但并不是所有父类中的数据成员和成员函数都可以被子类所继承,这主要看父类中的数据成员和成员函数所具有的权限。PHP中类中的数据成员和成员函数主要有以下几种权限。
(1)private:用该关键字限定的数据成员或成员函数,只有该类本身的成员函数可以访问,不能由该类实例化的对象访问,用该方法声明的元素称为私有成员。
(2)prototed:用该关键字限制的数据成员或成员函数,只有该类和其子类中的方法可以访问,不能由该类实例化的对象访问,用该方法声明的元素称为保护成员。
(3)public:用该关键字限制的数据成员或成员函数,不仅可以被该类或者该类的子类中的数据成员和成员函数所访问,还可以被该类实例化的对象所调用。
实现过程
(1)建立父类father。代码如下:
class father
{
private $m;
public function __construct($x)
{
$this->m=$x;
}
public function print_line_father()
{
echo "这是父类的成员函数! print_line_father()";
}
}
(2)建立子类child。代码如下:
class child extends father
{
private $n;
public function __construct($x)
{
$this->n=$x;
}
public function print_line_child()
{
echo "这是子类的成员函数! print_line_child()";
}
}
(3)对子类child进行实例化,并分别调用子类和父类的成员函数。代码如下:
$obj=new child("mrsoft");
$obj->print_line_child(); //调用子类的成员函数
echo "<br>";
$obj->print_line_father(); //调用父类的构造函数
举一反三