易截截图软件、单文件、免安装、纯绿色、仅160KB

PHP类实例教程(十四):设计模式之单件模式

单件模式要解决的问题就是“如何让这个类只有一个实例”。
我们的web应用中,大量使用了数据库连接,如果反复建立与数据库的连接必然消耗更多的系统资源。
我们如何解决这个问题,建立唯一的数据库连接是必要的方式。
我们又如何知道与这个数据库的连接是否已经建立? 还是需要现在建立?
单件模式可以解决这个问题。
先假设我们需要一个类完成在内存中只有一份的功能,我们该如何做呢?
我们一步一步的使用前面学过的知识来写一个单件的例子。
问题1:
前面学过,每次用new 类名的方式,就可以创建一个对象。
我们必须禁止外部程序用 new 类名的方式来创建多个实例。
解决办法:
我们将构造函数设置成private ,让构造函数只能在内部被调用,而外部不能调用。
这样,这个类就不能被外部用 new 的方式建立多个实例了。
不能被外部用new实例化的类。
<?php
class A
{
private function __construct() {
}
}
?>
问题2:
我们已经禁止外部用new实例化这个类,我们改如何让用户访问这个类呢?前门堵了,我们需要给用户留个后门。
解决办法:
static 修饰的方法,可以不经实例化一个类就可以直接访问这个方法。
后门就在这里。
<?php
class A
{
private function __construct() {
}
static function getClassA() {
return "这里是后门,可以通过这里进入这个类的内部";
}
}
echo A::getClassA();
?>
问题3:
虽然我们已经进入类内部,但我们要的是这个类的唯一实例?
先不管别的,我们先需要一个实例。
通过这个static的方法返回这个实例,如何做呢?
解决办法:
private的构造函数,不能被外部实例化。
但是我们已经成功潜入类的内部了(间谍?007?),我们在内部当然可以调用private的方法创建对象。
我们这样做看看。
下面的例子我们确实返回了A类的实例,但注意两次执行返回的不是同一个实例。
<?php
class A
{
private function __construct() {
}
static function getClassA() {
$a = new A();
return $a;
}
}
$a1 = A::getClassA();
$a2 = A::getClassA();
echo "\$a1的类是" . get_class($a1) . ", \$a2是" . get_class($a2);
if ($a1 === $a2) {
echo "<br />\$a1 \$a2指向同一个对象。";
} else {
echo "<br />\$a1 \$a2不是同一个对象。";
}
?>
问题4:
我们已经通过static方法返回了A的实例。但还有问题。


相关文档:

iis+php5+mysql配置

运行环境:windows xp sp2
          IIS v5.1
          PHP 5.3.1-Win32-VC9-x86
          Mysql 5.0
安装步骤:
       安装IIS5.1
在 ......

CentOS5 下安装Apache2+PHP5+MySQL

安装apache
# tar -zvxf httpd-2.2.14.tar.gz
# cd httpd-2.2.14
# ./configure --prefix=/usr/local/apache2 --enable-so --enable-rewrite
# make
# make install
安装MySQL
#yum -y install mysql-server
#yum -y install mysql-devel
安装 jpeg7
建立目录:
# mkdir -p /usr/local/jpeg7
# mkdir -p /usr/l ......

PHP计算指定日期所在周的开始和结束日期

<html>
<head>
<title>计算本周开始结束日期</title>
</head>
<body>
<form method="post" action="./index.html" enctype="utf-8">
<table>
<tr><td>输入年份</td><td><input name="year" type="text" maxlength="4" /></td> ......

php学习

编者按:学习php是一种枯燥无味,整天和代码打交道的过程,不过相信这篇文章会给你一点启示帮助。
如何学习PHP/学习php的方法,学东西,永远不要妄想有速成这一说,告诉你了一个方式,但是缺少努力这一环节,那也是白搭。 掌握好的学习方法非常必要,看看这篇如何学习PHP/学习php的方法[转载]
相信大家选择一种语言,并不是 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号