存档

‘php知识’ 分类的存档

php面向对象编程 – 使用接口实现松散耦合

2010年4月26日 没有评论

先来看一个紧密耦合的例子:
[php]
<?php

require_once "./AddressFormatters.php";

class Address
{
private $addressLine1;
private $addressLine2;
private $city;
private $state; // or province…
private $postalCode;
private $country;

public function setAddressLine1($line1)
{
$this->addressLine1 = $line1;
}

/* accessors, etc… */

public function getCountry()
{
return $this->country;
}

public function format($type)
{
if ($type == "inline") {
$formatter = new InlineAddressFormatter();
} else if ($type == "multiline") {
$formatter = new MultilineAddressFormatter();
} else {
$formatter = new NullAddressFormatter();
}
return $formatter->format($this->getAddressLine1(),
$this->getAddressLine2(),
$this->getCity(), $this->getState(), $this->getPostalCode(),
$this->getCountry());
}
}

$addr = new Address();
$addr->setAddressLine1("123 Any St.");
$addr->setAddressLine2("Ste 200");
$addr->setCity("Anytown");
$addr->setState("AY");
$addr->setPostalCode("55555-0000");
$addr->setCountry("US");

echo($addr->format("multiline"));
echo("\n");

echo($addr->format("inline"));
echo("\n");

?>
[/php]
在 Address 对象上调用 format() 方法的代码可能看上去很棒 — 这段代码所做的是使用 Address 类,调用 format() 并完成。相反,Address 类就没那么幸运。它需要了解用于正确格式化的各种格式化方法,这可能使 Address 对象无法被其他人很好地重用,尤其是在其他人没有兴趣在 format() 方法中使用格式化方法类的情况下。虽然使用 Address 的代码没有许多依赖关系,但是 Address 类却有大量代码,而它可能只是一个简单的数据对象。

在构建优秀的 OO 设计时,必须考虑称为关注点分离(Separation of Concerns,SoC)的概念。SoC 指尝试通过真正关注的内容分离对象,从而降低耦合度。在最初的 Address 类中,它必须关注如何进行格式化。这可能不是优秀的设计。然而,Address 类应当考虑 Address 的各部分,而某种格式化方法应当关注如何正确格式化地址。
看一下如何通过使用接口来实现松散耦合:
[php]
<?php

interface AddressFormatter
{
public function format($addressLine1, $addressLine2, $city, $state,
$postalCode, $country);
}

class MultiLineAddressFormatter implements AddressFormatter
{
public function format($addressLine1, $addressLine2, $city, $state,
$postalCode, $country)
{
return sprintf("%s\n%s\n%s, %s %s\n%s",
$addressLine1, $addressLine2, $city, $state, $postalCode, $country);
}
}

class InlineAddressFormatter implements AddressFormatter
{
public function format($addressLine1, $addressLine2, $city, $state,
$postalCode, $country)
{
return sprintf("%s %s, %s, %s %s %s",
$addressLine1, $addressLine2, $city, $state, $postalCode, $country);
}
}

class AddressFormatUtils
{
public static function formatAddress($type, $address)
{
$formatter = AddressFormatUtils::createAddressFormatter($type);

return $formatter->format($address->getAddressLine1(),
$address->getAddressLine2(),
$address->getCity(), $address->getState(),
$address->getPostalCode(),
$address->getCountry());
}

private static function createAddressFormatter($type)
{
if ($type == "inline") {
$formatter = new InlineAddressFormatter();
} else if ($type == "multiline") {
$formatter = new MultilineAddressFormatter();
} else {
$formatter = new NullAddressFormatter();
}
return $formatter;
}
}

$addr = new Address();
$addr->setAddressLine1("123 Any St.");
$addr->setAddressLine2("Ste 200");
$addr->setCity("Anytown");
$addr->setState("AY");
$addr->setPostalCode("55555-0000");
$addr->setCountry("US");

echo(AddressFormatUtils::formatAddress("multiline", $addr));
echo("\n");

echo(AddressFormatUtils::formatAddress("inline", $addr));
echo("\n");
?>

[/php]

在上面的代码中,省略了address的部分代码。关键部分展示了:格式化地址的代码被移到接口、实现类和工厂中 — 养成 “使用接口” 的习惯。现在,AddressFormatUtils 类负责创建格式化方法并格式化 Address。任何其他对象现在都可以使用 Address 而不必担心要求获得格式化方法的定义。

当然,缺点是只要使用模式,通常就意味着工件(类、文件)的数量会增加。但是,通过减少每个类中的维护可以弥补这个缺点,甚至在获得正确的可重用性时反而可以减少工件量。

如果你想对php面向对象编程中接口的使用方法进一步了解的话,可以参考一下这篇文章:php接口学习 —— php面向对象编程

作者: 石巍
原载: 在 PHP 中养成 7 个面向对象的好习惯
版权所有,转载时必须以超链接形式注明作者和原始出处及本声明。

本文链接: http://www.smartwei.com/php-separation-of-concerns.html

php接口学习 —— php面向对象编程

2010年3月31日 没有评论

php-interface
先来看一段php面向对象编程的代码:
[php]
<?php
class DBPersonProvider
{
public function getPerson($givenName, $familyName)
{
/*省略了 链接数据库,获取person信息 */
$person = new Person();
$person->setPrefix("Mr.");
$person->setGivenName("John");
return $person;
}
}

/*获取persoin信息 */
$provider = new DBPersonProvider();
$person = $provider->getPerson("John", "Doe");

echo($person->getPrefix());
echo($person->getGivenName());

?>
[/php]
这一段代码可以实现从数据库中取出数据,赋值给Person对象然后返回这一功能。在环境发生更改之前,代码都可以正常运行。但是,从数据库装入 Person 可能适用于第一个版本的应用程序,但是对于第二个版本,可能需要添加从 Web 服务装入人员的功能。此时,因为上述代码直接使用实现类导致了现在能做的更改十分有限(修改的话,可能会大范围改动代码)。
为了今后升级和维护起来方便,我们需要用到php的接口来改造上面的方法。先介绍一下php接口的相关知识:
阅读全文…

获取脚本执行时间的php类 – 含有暂停功能

2010年3月9日 没有评论

php-class-time-tracking
上一篇文章,给大家介绍了一个获取脚本执行时间的php类, 今天再给大家介绍一个。今天的这个获取脚本执行时间的php类的特别之处是它提供了“暂停|开启”功能,可以让我们很方便的跳过某些代码的执行时间。

举个例子,当我们只想知道页面中SQL的执行时间是多长,我们就可以在每次进行SQL查询之前,开始计时,查询之后暂停计时,然后开始处理数据,下一次进行SQL查询时再开始计时…这样最终的执行时间,就是我们想要的SQL执行时间了。

下面看一下代码
阅读全文…

获取脚本执行时间的php类

2010年2月28日 1 条评论

Script Time Tracking
在平时的Php开发工程中,我经常会检测一下脚本的执行时间,如果发现脚本的执行时间比预想的长很多,那么肯定是这段脚本编写有问题,需要进行代码优化。下面给大家介绍一个获取脚本执行时间的php类
阅读全文…

php服务器端变量$_SERVER详解

2010年2月22日 没有评论

今天看到了一个帖子,是关于php服务器端变量$_SERVER的详解,觉得写的很不错,转载了和大家分享一下。帖子的原始出处是:珍爱生命,远离螃蟹

服务器变量 $_SERVER 详解:

1、$_SESSION['PHP_SELF'] — 获取当前正在执行脚本的文件名

2、$_SERVER['SERVER_PROTOCOL'] — 请求页面时通信协议的名称和版本。例如,“HTTP/1.0”。

3、$_SERVER['REQUEST_TIME'] — 请求开始时的时间戳。从 PHP 5.1.0 起有效。和time函数效果一样。

4、$_SERVER['argv'] — 传递给该脚本的参数。我试了下,get方法可以得到$_SERVER['argv'][0];post方法无法给他赋值。

5、$_SERVER['SERVER_NAME'] — 返回当前主机名。
阅读全文…

php面向对象编程-封装字符串处理函数

2009年12月28日 没有评论

众所周知,php5较以前版本更好的支持了面向对象编程。今天给大家介绍的php类是一个字符串处理类,它封装了字符串处理的常用函数,对于学习php面向对象编程的朋友们,可以从这个类的代码中学到一些封装的技巧和要考虑的东西。废话不多说了,来看看这个类:
阅读全文…

可以生成缩略图的PHP上传图片类

2009年12月28日 没有评论


做图片类网站的朋友可能都有自己上传图片的方式方法。这里给大家介绍一个php上传图片类,它可以验证上传文件是否为图片,图片的格式是否是网站所接受的;还可以生成指定大小的缩略图。具体方法如下所示:
阅读全文…

一个简单的php缓存类

2009年12月23日 1 条评论

我们知道,当网站的访问量很大的时候,就需要使用缓存技术来缓解服务器的压力。网上有关缓存的内容非常的多,有兴趣的朋友可以学习一下memcache, xcache等等比较知名、功能也比较强大的开源代码。这篇文章给大家介绍一个简单的php缓存类,这个php缓存类是通过使用ob_start(),和ob_end_flush这两个函数实现对页面内容的缓存。
阅读全文…

分类: php知识 标签: , ,

php目录删除类

2009年12月23日 5 条评论

php删除目录今天给大家介绍一个php目录删除类,作者是Ritesh Patel,大家对这个类有什么意见或建议,可以通过patel.ritesh.mscit@gmail.com来联系他。
这个php目录删除类使用起来很方便,无论给定目录是不是为空,他都可以将它以及它的子目录全部删除。
下面就让我们来了解一下这个PHP目录删除类的详细内容:

阅读全文…

用PHP创建UTF8文件

2009年12月22日 没有评论

php生成utf8文件

[php]
<?php
//以wb方式打开文件,先用函数utf8_encode将所需写入的数据变成UTF编码格式。
$f=fopen("test.txt", "wb");
$text=utf8_encode("a!");

//"\\xEF\\xBB\\xBF",这串字符不可缺少,生成的文件将成为UTF-8格式,否则依然是ANSI格式。
$text="\\xEF\\xBB\\xBF".$text;

//将转换好格式的内容写入。
fputs($f, $text);
fclose($f);
?>
[/php]
很简单,这样,我们就用PHP创建了一个utf8的文件。朋友们需要记住,对要写入的内容进行utf8_encode()转换之后还没有完,需要在内容的前面加上”\\xEF\\xBB\\xBF”字符串(不包含双引号)。

作者: 石巍
原载: 10V
版权所有,转载时必须以超链接形式注明作者和原始出处及本声明。

本文链接: http://www.smartwei.com/php-generate-utf8-file.html