您当前的位置:首页 > 网站建设笔记 >

PHP 使用构造函数创建实例

来源:PHP5范例代码查询辞典0

2-1 使用构造函数创建实例

要创建一个类的新实例(也称为实现类的实例化(instantiating)),可以使用new操作符,并调用类名(就好像它是一个函数)。以这种方式使用时,类名作为类构造函数(class constructor)来初始化实例。这个实例由一个变量表示,它遵循PHP中变量和标识符名的一般规则。例如,考虑以下代码:

$tweety = new Bird("Tweety","canary");

这个代码创建了Bird的一个特定实例,并将其赋给名为$tweety的变量。换句话说,这里将$tweety定义为一个Bird。到目前为止,你还没有为Bird类具体定义任何成员,而且我们也没有讨论PHP5中如何定义类,所以下面先来完成这些任务。

代码

<?php
class Bird
{
	function __construct($name, $breed)
	{
		$this->name = $name;
		$this->breed = $breed;
	}
}
?>

工作原理/变化情况

这可能是用PHP5写的最简单的类定义。与PHP4类似,PHP5的类定义在一个代码块中,最前面是关键字class,然后是类名。在大多数情况下,类本身并没有用处,除非可以创建类的实例(这个一般规则也有例外)。要完成这个任务,需要有一个类构造函数。在PHP5中,为此要定义名为__construct()的方法,只要创建类的一个新实例就能调用这个方法。

说明 在大多数编程语言中(包括PHP),一般都约定类名以一个大写字母开头,而类实例名都以一个小写字母开头。

说明 在PHP4中,类构造函数写为与类同名的一个方法(例如,使用Bird()方法作为Bird类的构造函数)。尽管PHP5仍支持以这种方式创建类的实例,以保证向后兼容,但建议不要在新代码中采用这种做法。

$this关键字有一个特殊的用途:利用这个关键字,可以在类定义中引用实例。它就相当于一个占位符,表示“这个类的当前实例”。Bird类构造函数将字符串"Tweety"赋给所创建实例的name属性,并把字符串"canary"赋给其breed属性。可以用下面的代码来测试:

<?php
class Bird
{
	function __construct($name, $breed)
	{
		$this->name = $name;
		$this->breed = $breed;
	}
}
$tweety = new Bird("Tweety","canary");
printf("<p>%s is a %s</p>\n", $tweety->name, $tweety->breed);
?>

得到的结果如下:
Tweety is a canary

要确定Tweety的定价,可以设置price属性,并用以下代码输出:

<?php
// ...class defined and constructor called as previously shown...

$tweety->price = 24.95;

printf("<p>%s is a %s and costs \$%.2f</p>\n", $tweety->name, $tweety->breed, $tweety->price);
?>

它的输出如下所示:
Tweety is a canary and costs $24.95

注意类本身并没有定义$price变量,这里只是任意创建了一个属性。尽管这一点不算太糟糕,但也不是太好,这说明很容易创建出与其他对象结构不一致的Bird对象。如果应用程序依赖于一个前提条件,要求所有鸟都有价格,那么第一次忘记为某只鸟指定价格时就会遇到麻烦。通过在构造函数中包含一个price属性,从而确保每个Bird都有这样一个属性,就会好得多。稍后我们还会讨论这个问题,不过关于实例创建和实例化的讨论就到这里了。

说明 可以创建一个没有__construct()方法的类,甚至还能对这样一个类实例化,但是大多数情况下这个类都没有太大用处。

2-2 使用默认构造函数

假设大多数鸟(比如说,80%的鸟)的价格都是$15。如果让所有Bird实例的价格都预先设置为这个值($15),而对余下的20%设置另外的价格,这样不是更方便吗?PHP允许为函数参数和类构造函数设置默认值。下例显示了一个稍做修改的Bird类。

代码

<?php
class Bird
{
	function __construct($name="No-name", $breed="breed unknown", $price=15)
	{
		$this->name = $name;
		$this->breed = $breed;
		$this->price = $price;
	}
}
$aBird = new Bird();
$tweety = new Bird("Tweety", "canary");

printf("<p>%s is a %s and costs \$%.2f</p>\n", $aBird->name, $aBird->breed, $aBird->price);

$tweety->price = 24.95;

printf("<p>%s is a %s and costs \$%.2f</p>\n", $tweety->name, $tweety->breed, $tweety->price);
?>

输出如下:
No-name is a breed unknown and costs $15.00
Tweety is a canary and costs $24.95

工作原理

这里为Bird类创建了一个默认构造函数。创建这个类的一个新实例时,即使忘记为一个或多个属性设置值,也不会遇到麻烦,例如不会遭遇到除0错误。

建站咨询

在线咨询真诚为您提供专业解答服务

咨询热线

137 1731 25507×24小时服务热线

微信交流

二维码终于等到你,还好我没放弃
返回顶部