最新更新 sitemap 网站制作设计本站搜索
网页设计
国外网站 韩国网站 个人主页 手提袋设计 CSS 网页特效 平面设计 网站设计 Flash CMS技巧 服装网站 php教程 photoshop 画册 服务器选用 数据库 Office
虚拟主机 域名注册 云主机 网页设计 客服QQ:8208442
当前位置:首页 > 编程开发 > php教程

PHP实例说明编写PHP代码的5个好习惯

日期:05-03    来源:    作者:

提示:有些人问,优秀程序员和大牛有什么区别,大概有10到20种吧。因为大牛有很好的编程习惯和丰富的经验,所以他们非常的高效。如果不好的编程习惯出现在你的代码里,你的代码效率就会降低。本文阐述一些好的编程习惯,他们可以让你成为更好的程序员。8Gh中国设计秀

 8Gh中国设计秀

5个PHP编程的好习惯8Gh中国设计秀

有些人问,优秀程序员和大牛有什么区别,大概有10到20种吧。因为大牛有很好的编程习惯和丰富的经验,所以他们非常的高效。如果不好的编程习惯出现在你的代码里,你的代码效率就会降低。本文阐述一些好的编程习惯,他们可以让你成为更好的程序员。8Gh中国设计秀

这些习惯能让你的代码在高效运行的同时提高可维护性。你写代码的时候,可能大部分时间都浪费在维护上了,程序的维护代价很高。培养良好的编程习惯,如模块化设计,可以让你的代码可读性更好,从而容易维护。8Gh中国设计秀

代码中的问题往往伴随着不良的编程习惯,而且后者会导致代码不好修改并可能出现新的缺陷。下面有五个好的编程习惯,将帮你避免这些陷阱:8Gh中国设计秀

  1. 使用友好的命名方式。
  2. 使用更精悍短小的代码。
  3. 注释你的代码。
  4. 编写异常处理。
  5. 永远,永远不要复制粘贴.(玉米:我深深的同意这一点)

下面的章节将解释这些习惯。8Gh中国设计秀

良好的命名方式是最重要的编程习惯,因为好的命名会让代码易懂,好懂。代码的可读性决定它的可维护性。即使你在代码没有写注释,如果它可读性好的话,它也修改起来也会简单。你应该在练习开时就使用良好的命名方式,让你的代码像一本书一样。8Gh中国设计秀

例1包含一个过短的变量名,写出这样的代码非常不好弄懂,而且函数名也没有清晰的描述出这个方法是做什么的。函数名表示了函数的功能,如果它却是做别的用途的,那就会误导别人。8Gh中国设计秀

 8Gh中国设计秀

<?php8Gh中国设计秀
8Gh中国设计秀
function getNBDay($d)8Gh中国设计秀
{8Gh中国设计秀
switch($d) {8Gh中国设计秀
case 5:8Gh中国设计秀
case 6:8Gh中国设计秀
case 7:8Gh中国设计秀
return 1;8Gh中国设计秀
default:8Gh中国设计秀
return ($d + 1);8Gh中国设计秀
}8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
$day = 5;8Gh中国设计秀
8Gh中国设计秀
$nextDay = getNBDay($day);8Gh中国设计秀
8Gh中国设计秀
echo ("Next day is: " . $nextDay . "n");8Gh中国设计秀
8Gh中国设计秀
?>8Gh中国设计秀

 例2则给出了使用良好命名方式的代码。重新命名函数是为了更好的反映它们的功能。变量也重新命名为描述性的。只有一个在循环中的$i还使用短的变量名。尽管有些人不同意,短变量名在循环中是请允许的——甚至更好些,因为它们清晰的起到了指针的功能。8Gh中国设计秀

<?php8Gh中国设计秀
8Gh中国设计秀
define ('MONDAY', 1);8Gh中国设计秀
define ('TUESDAY', 2);8Gh中国设计秀
define ('WEDNESDAY', 3);8Gh中国设计秀
define ('THURSDAY', 4);8Gh中国设计秀
define ('FRIDAY', 5);8Gh中国设计秀
define ('SATURDAY', 6);8Gh中国设计秀
define ('SUNDAY', 7);8Gh中国设计秀
8Gh中国设计秀
/*8Gh中国设计秀
*8Gh中国设计秀
* @param $dayOfWeek8Gh中国设计秀
* @return int Day of week, with 1 being Monday and so on.8Gh中国设计秀
*/8Gh中国设计秀
function findNextBusinessDay($dayOfWeek)8Gh中国设计秀
{8Gh中国设计秀
$nextBusinessDay = $dayOfWeek;8Gh中国设计秀
8Gh中国设计秀
switch($dayOfWeek) {8Gh中国设计秀
case FRIDAY:8Gh中国设计秀
case SATURDAY:8Gh中国设计秀
case SUNDAY:8Gh中国设计秀
$nextBusinessDay = MONDAY;8Gh中国设计秀
break;8Gh中国设计秀
default:8Gh中国设计秀
$nextBusinessDay += 1;8Gh中国设计秀
break;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
return $nextBusinessDay;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
$day = FRIDAY;8Gh中国设计秀
8Gh中国设计秀
$nextBusDay = findNextBusinessDay($day);8Gh中国设计秀
8Gh中国设计秀
echo ("Next day is:" . $nextBusDay . "n");8Gh中国设计秀
8Gh中国设计秀
?>8Gh中国设计秀

我鼓励你在函数中分隔长的条件给函数命名,以便于描述这个条件。(玉米:这句话啥意思?5555)这个技巧会让你的代码容易阅读和扩展,因此它可以被抽象复用。如果条件发生了改变,这样也会很容易更新函数 .由于方法有一个见名知义的名字,化码就不会失去它本来的意思或者变得难以理解。8Gh中国设计秀

使用更少的代码8Gh中国设计秀

编写代码、解决问题是一种容易的事情。当你解决一个正在发生的问题,编呀编,写呀写,你的方法越来越长。只要你回头使用更少的代码来重构,就是过了很久也没什么问题。8Gh中国设计秀

重构是个好主意,但你应该养成第一次就写出更短小精悍代码的习惯。在一个窗口上(玉米:不用翻页)就能看全的短小函数更容易理解。 要是一个函数长出了窗口,就很难理解了,因为你不能快速的从头到脚的浏览整个代码。8Gh中国设计秀

当构思一个方法的时候,你还应该养成一个让它们只做一件事情的习惯。以下因素写代码时应常注意。第一,只做一件事情的函数更易于复用。第二,这样的函数测试更方便。第三,这样的函数好读易懂方便改——如果必要的话——让它们尽可能的简单吧。8Gh中国设计秀

坏习惯:过长的函数(很多时候)8Gh中国设计秀

例三是过长函数的表现。它不知道自己要做什么。它做太多的事情,所以没有集成化。它更难以理解,不好Debug和测试。它遍历文件建立列表,它给对象赋值,它做一些计算,……它耕田,它浇水,甚至做更多事情。(^_^)8Gh中国设计秀

例三. 坏习惯:过长函数8Gh中国设计秀

 8Gh中国设计秀

<?php8Gh中国设计秀
8Gh中国设计秀
function writeRssFeed($user)8Gh中国设计秀
{8Gh中国设计秀
// Get the DB connection information8Gh中国设计秀
8Gh中国设计秀
8Gh中国设计秀
// look up the user's preferences...8Gh中国设计秀
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')8Gh中国设计秀
OR die(mysql_error());8Gh中国设计秀
8Gh中国设计秀
// Query8Gh中国设计秀
$perfsQuery = sprintf("SELECT max_stories FROM user_perfs WHERE user= '%s'",8Gh中国设计秀
mysql_real_escape_string($user));8Gh中国设计秀
8Gh中国设计秀
$result = mysql_query($query, $link);8Gh中国设计秀
8Gh中国设计秀
$max_stories = 25; // default it to 25;8Gh中国设计秀
8Gh中国设计秀
if ($row = mysql_fetch_assoc($result)) {8Gh中国设计秀
$max_stories = $row['max_stories'];8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
// go get my data8Gh中国设计秀
$perfsQuery = sprintf("SELECT * FROM stories WHERE post_date = '%s'",8Gh中国设计秀
mysql_real_escape_string());8Gh中国设计秀
8Gh中国设计秀
$result = mysql_query($query, $link); 8Gh中国设计秀
8Gh中国设计秀
8Gh中国设计秀
$feed = "<rss version="2.0">" .8Gh中国设计秀
"<channel>" .8Gh中国设计秀
"<title>My Great Feed</title>" .8Gh中国设计秀
"<link>http://www.example.com/feed.xml</link>" .8Gh中国设计秀
"<description>The best feed in the world</description>" .8Gh中国设计秀
"<language>en-us</language>" .8Gh中国设计秀
"<pubDate>Tue, 20 Oct 2008 10:00:00 GMT</pubDate>" .8Gh中国设计秀
"<lastBuildDate>Tue, 20 Oct 2008 10:00:00 GMT</lastBuildDate>" .8Gh中国设计秀
"<docs>http://www.example.com/rss</docs>" .8Gh中国设计秀
"<generator>MyFeed Generator</generator>" .8Gh中国设计秀
"<managingEditor>editor@example.com</managingEditor>" .8Gh中国设计秀
"<webMaster>webmaster@example.com</webMaster>" .8Gh中国设计秀
"<ttl>5</ttl>";8Gh中国设计秀
8Gh中国设计秀
// build the feed...8Gh中国设计秀
while ($row = mysql_fetch_assoc($result)) {8Gh中国设计秀
$title = $row['title'];8Gh中国设计秀
$link = $row['link'];8Gh中国设计秀
$description = $row['description'];8Gh中国设计秀
$date = $row['date'];8Gh中国设计秀
$guid = $row['guid'];8Gh中国设计秀
8Gh中国设计秀
$feed .= "<item>";8Gh中国设计秀
$feed .= "<title>" . $title . "</title>";8Gh中国设计秀
$feed .= "<link>" . $link . "</link>";8Gh中国设计秀
$feed .= "<description> " . $description . "</description>";8Gh中国设计秀
$feed .= "<pubDate>" . $date . "</pubDate>";8Gh中国设计秀
$feed .= "<guid>" . $guid . "</guid>";8Gh中国设计秀
$feed .= "</item>";8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
$feed .= "</rss";8Gh中国设计秀
8Gh中国设计秀
// write the feed out to the server...8Gh中国设计秀
echo($feed);8Gh中国设计秀
8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
?>8Gh中国设计秀

要是你再加更多东西到这个函数里,它会很快变得难以维护。8Gh中国设计秀

好习惯:可管理,集成化的函数8Gh中国设计秀

<?php8Gh中国设计秀
8Gh中国设计秀
function createRssHeader()8Gh中国设计秀
{8Gh中国设计秀
return "<rss version="2.0">" .8Gh中国设计秀
"<channel>" .8Gh中国设计秀
"<title>My Great Feed</title>" .8Gh中国设计秀
"<link>http://www.example.com/feed.xml</link>" .8Gh中国设计秀
"<description>The best feed in the world</description>" .8Gh中国设计秀
"<language>en-us</language>" .8Gh中国设计秀
"<pubDate>Tue, 20 Oct 2008 10:00:00 GMT</pubDate>" .8Gh中国设计秀
"<lastBuildDate>Tue, 20 Oct 2008 10:00:00 GMT</lastBuildDate>" .8Gh中国设计秀
"<docs>http://www.example.com/rss</docs>" .8Gh中国设计秀
"<generator>MyFeed Generator</generator>" .8Gh中国设计秀
"<managingEditor>editor@example.com</managingEditor>" .8Gh中国设计秀
"<webMaster>webmaster@example.com</webMaster>" .8Gh中国设计秀
"<ttl>5</ttl>";8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
function createRssFooter()8Gh中国设计秀
{8Gh中国设计秀
return "</channel></rss>";8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
function createRssItem($title, $link, $desc, $date, $guid) 8Gh中国设计秀
{8Gh中国设计秀
$item .= "<item>";8Gh中国设计秀
$item .= "<title>" . $title . "</title>";8Gh中国设计秀
$item .= "<link>" . $link . "</link>";8Gh中国设计秀
$item .= "<description> " . $description . "</description>";8Gh中国设计秀
$item .= "<pubDate>" . $date . "</pubDate>";8Gh中国设计秀
$item .= "<guid>" . $guid . "</guid>";8Gh中国设计秀
$item .= "</item>";8Gh中国设计秀
return $item;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
function getUserMaxStories($db_link, $default)8Gh中国设计秀
{8Gh中国设计秀
$perfsQuery = sprintf("SELECT max_stories FROM user_perfs WHERE user= '%s'",8Gh中国设计秀
mysql_real_escape_string($user));8Gh中国设计秀
8Gh中国设计秀
$result = mysql_query($perfsQuery, $db_link);8Gh中国设计秀
8Gh中国设计秀
$max_stories = $default;8Gh中国设计秀
8Gh中国设计秀
if ($row = mysql_fetch_assoc($result)) {8Gh中国设计秀
$max_stories = $row['max_stories'];8Gh中国设计秀
} 8Gh中国设计秀
8Gh中国设计秀
return $max_stories;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
function writeRssFeed($user)8Gh中国设计秀
{8Gh中国设计秀
// Get the DB connection information8Gh中国设计秀
$settings = parse_ini_file("rss_server.ini");8Gh中国设计秀
8Gh中国设计秀
// look up the user's preferences...8Gh中国设计秀
$link = mysql_connect($settings['db_host'], $settings['user'], 8Gh中国设计秀
$settings['password']) OR die(mysql_error());8Gh中国设计秀
8Gh中国设计秀
$max_stories = getUserMaxStories($link, 25);8Gh中国设计秀
8Gh中国设计秀
// go get my data8Gh中国设计秀
$newsQuery = sprintf("SELECT * FROM stories WHERE post_date = '%s'",8Gh中国设计秀
mysql_real_escape_string(time()));8Gh中国设计秀
8Gh中国设计秀
$result = mysql_query($newsQuery, $link); 8Gh中国设计秀
8Gh中国设计秀
$feed = createRssHeader();8Gh中国设计秀
8Gh中国设计秀
$i = 0;8Gh中国设计秀
// build the feed...8Gh中国设计秀
while ($row = mysql_fetch_assoc($result)) {8Gh中国设计秀
if ($i < $max_stories) {8Gh中国设计秀
$title = $row['title'];8Gh中国设计秀
$link = $row['link'];8Gh中国设计秀
$description = $row['description'];8Gh中国设计秀
$date = $row['date'];8Gh中国设计秀
$guid = $row['guid'];8Gh中国设计秀
8Gh中国设计秀
$feed .= createRssItem($title, $link, $description, $date, $guid);8Gh中国设计秀
8Gh中国设计秀
$i++;8Gh中国设计秀
} else { 8Gh中国设计秀
break;8Gh中国设计秀
}8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
mysql_close($link);8Gh中国设计秀
8Gh中国设计秀
$feed .= createRssFooter();8Gh中国设计秀
8Gh中国设计秀
// write the feed out to the server...8Gh中国设计秀
echo($feed);8Gh中国设计秀
}8Gh中国设计秀
?>8Gh中国设计秀

把长函数分割会导致效率降低,所以要注意,这个好习惯不要使用过度。这样做可能也会引起阅读性差,跟原来人家是一个整体时没什么区别。8Gh中国设计秀

注释代码8Gh中国设计秀

注释你的代码有时就像你刚着手写代码一样困难。明确注释内容很棘手,因为他要写出代码要做什么。注释变量是一个好主意。在函数头部注释可能不太明显时,就可以告诉阅读者函数要什么参数,有什么返回以及主要的意图。8Gh中国设计秀

通常大家会注释代码是做什么的,但这并不必要。如果代码让人困惑以至于你不得不写注释说它是做什么的,这就提示你应该重写它,使它更好懂。命名良好、更加短小、组织合理的代码习惯会让你的代码用不着注释就拥有很高的可读性。8Gh中国设计秀

坏习惯:压根没有或者叽叽歪歪的函数注释 (^_^)8Gh中国设计秀

例5的注释只给出了代码在做什么——它的通过循环的遍历、加了个数。但是丢了为什么这么做和要做什么。 这会让别人难以不影响原代码的情形下安全修改的做出修改。8Gh中国设计秀

例5 :压根没胡或者叽叽歪歪的函数注释8Gh中国设计秀

 8Gh中国设计秀

<?php8Gh中国设计秀
8Gh中国设计秀
class ResultMessage 8Gh中国设计秀
{8Gh中国设计秀
private $severity;8Gh中国设计秀
private $message;8Gh中国设计秀
8Gh中国设计秀
public function __construct($sev, $msg) 8Gh中国设计秀
{8Gh中国设计秀
$this->severity = $sev;8Gh中国设计秀
$this->message = $msg;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
public function getSeverity()8Gh中国设计秀
{8Gh中国设计秀
return $this->severity;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
public function setSeverity($severity)8Gh中国设计秀
{8Gh中国设计秀
$this->severity = $severity;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
public function getMessage()8Gh中国设计秀
{8Gh中国设计秀
return $this->message;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
public function setMessage($msg)8Gh中国设计秀
{8Gh中国设计秀
$this->message = $msg;8Gh中国设计秀
}8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
function cntMsgs($messages)8Gh中国设计秀
{8Gh中国设计秀
$n = 0;8Gh中国设计秀
/* iterate through the messages... */8Gh中国设计秀
foreach($messages as $m) {8Gh中国设计秀
if ($m->getSeverity() == 'Error') {8Gh中国设计秀
$n++; // add one to the result;8Gh中国设计秀
}8Gh中国设计秀
}8Gh中国设计秀
return $n;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
$messages = array(new ResultMessage("Error", "This is an error!"),8Gh中国设计秀
new ResultMessage("Warning", "This is a warning!"),8Gh中国设计秀
new ResultMessage("Error", "This is another error!"));8Gh中国设计秀
8Gh中国设计秀
$errs = cntMsgs($messages);8Gh中国设计秀
8Gh中国设计秀
echo("There are " . $errs . " errors in the result.n");8Gh中国设计秀
8Gh中国设计秀
?>8Gh中国设计秀

好习惯: 注释函数和类8Gh中国设计秀

例6里的注释标明了类和函数的意图。注释表明方法做了什么和为什么做,这会对将来了解代码的意图很有帮助。环境的变化会需要你进行代码修改,这就会让很容易的知道开始时你代码是做什么的。8Gh中国设计秀

例6.好习惯:注释函数和类8Gh中国设计秀

 8Gh中国设计秀

<?php8Gh中国设计秀
/**8Gh中国设计秀
* The ResultMessage class holds a message that can be returned8Gh中国设计秀
* as a result of a process. The message has a severity and8Gh中国设计秀
* message.8Gh中国设计秀
* 8Gh中国设计秀
* @author nagood8Gh中国设计秀
*8Gh中国设计秀
*/8Gh中国设计秀
class ResultMessage 8Gh中国设计秀
{8Gh中国设计秀
private $severity;8Gh中国设计秀
private $message;8Gh中国设计秀
8Gh中国设计秀
/**8Gh中国设计秀
* Constructor for the ResultMessage that allows you to assign8Gh中国设计秀
* severity and message.8Gh中国设计秀
* @param $sev See {@link getSeverity()}8Gh中国设计秀
* @param $msg8Gh中国设计秀
* @return unknown_type8Gh中国设计秀
*/8Gh中国设计秀
public function __construct($sev, $msg) 8Gh中国设计秀
{8Gh中国设计秀
$this->severity = $sev;8Gh中国设计秀
$this->message = $msg;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
/**8Gh中国设计秀
* Returns the severity of the message. Should be one8Gh中国设计秀
* "Information", "Warning", or "Error".8Gh中国设计秀
* @return string Message severity8Gh中国设计秀
*/8Gh中国设计秀
public function getSeverity()8Gh中国设计秀
{8Gh中国设计秀
return $this->severity;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
/**8Gh中国设计秀
* Sets the severity of the message8Gh中国设计秀
* @param $severity8Gh中国设计秀
* @return void8Gh中国设计秀
*/8Gh中国设计秀
public function setSeverity($severity)8Gh中国设计秀
{8Gh中国设计秀
$this->severity = $severity;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
public function getMessage()8Gh中国设计秀
{8Gh中国设计秀
return $this->message;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
public function setMessage($msg)8Gh中国设计秀
{8Gh中国设计秀
$this->message = $msg;8Gh中国设计秀
}8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
8Gh中国设计秀
/*8Gh中国设计秀
* Counts the messages with the given severity in the array8Gh中国设计秀
* of messages.8Gh中国设计秀
* 8Gh中国设计秀
* @param $messages An array of ResultMessage8Gh中国设计秀
* @return int Count of messages with a severity of "Error"8Gh中国设计秀
*/8Gh中国设计秀
function countErrors($messages)8Gh中国设计秀
{8Gh中国设计秀
$matchingCount = 0;8Gh中国设计秀
foreach($messages as $m) {8Gh中国设计秀
if ($m->getSeverity() == "Error") {8Gh中国设计秀
$matchingCount++;8Gh中国设计秀
}8Gh中国设计秀
}8Gh中国设计秀
return $matchingCount;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
$messages = array(new ResultMessage("Error", "This is an error!"),8Gh中国设计秀
new ResultMessage("Warning", "This is a warning!"),8Gh中国设计秀
new ResultMessage("Error", "This is another error!"));8Gh中国设计秀
8Gh中国设计秀
$errs = countErrors($messages);8Gh中国设计秀
8Gh中国设计秀
echo("There are " . $errs . " errors in the result.n");8Gh中国设计秀
8Gh中国设计秀
?>8Gh中国设计秀

异常处理8Gh中国设计秀

写健壮应用时经常会提到的异常处理,一般遵循着80/20原则: 80%的代码用于处理异常或者验证,20%的代码没什么实际的用途。原始的代码通常都是在乐观的环境下编写的。这意味着代码可以在数据正常、一切理解的基础环境中工作的很好。但是这种代码在其生命周期内是脆弱的。在极端的情形中,你得花更多的时间来未很可能永远不会发生的状况编写相应代码。8Gh中国设计秀

这个习惯就是要你处理全部的出错情况,而且如果要是不这么做,你的代码永远也完不成。8Gh中国设计秀

坏习惯:不处理任何异常8Gh中国设计秀

<?php8Gh中国设计秀
8Gh中国设计秀
// Get the actual name of the 8Gh中国设计秀
function convertDayOfWeekToName($day)8Gh中国设计秀
{8Gh中国设计秀
$dayNames = array(8Gh中国设计秀
"Sunday",8Gh中国设计秀
"Monday",8Gh中国设计秀
"Tuesday",8Gh中国设计秀
"Wednesday",8Gh中国设计秀
"Thursday",8Gh中国设计秀
"Friday",8Gh中国设计秀
"Saturday");8Gh中国设计秀
return $dayNames[$day];8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
echo("The name of the 0 day is: " . convertDayOfWeekToName(0) . "n");8Gh中国设计秀
echo("The name of the 10 day is: " . convertDayOfWeekToName(10) . "n");8Gh中国设计秀
echo("The name of the 'orange' day is: " . convertDayOfWeekToName('orange') . "n");8Gh中国设计秀
8Gh中国设计秀
?>8Gh中国设计秀

好习惯: 防守型编程8Gh中国设计秀

例8表明处理并抛出异常是一件很有意义的事情。不只是额外的异常处理可以让代码健壮,但是这有助于提高代码的可读性。这种异常处理为原作者查看何时编写提供了一个很好的说明。8Gh中国设计秀

例8.好习惯:防守型编程8Gh中国设计秀

<?php8Gh中国设计秀
8Gh中国设计秀
/**8Gh中国设计秀
* This is the exception thrown if the day of the week is invalid.8Gh中国设计秀
* @author nagood8Gh中国设计秀
*8Gh中国设计秀
*/8Gh中国设计秀
class InvalidDayOfWeekException extends Exception { }8Gh中国设计秀
8Gh中国设计秀
class InvalidDayFormatException extends Exception { }8Gh中国设计秀
8Gh中国设计秀
/**8Gh中国设计秀
* Gets the name of the day given the day in the week. Will8Gh中国设计秀
* return an error if the value supplied is out of range.8Gh中国设计秀
* 8Gh中国设计秀
* @param $day8Gh中国设计秀
* @return unknown_type8Gh中国设计秀
*/8Gh中国设计秀
function convertDayOfWeekToName($day)8Gh中国设计秀
{8Gh中国设计秀
if (! is_numeric($day)) {8Gh中国设计秀
throw new InvalidDayFormatException('The value '' . $day . '' is an ' .8Gh中国设计秀
'invalid format for a day of week.');8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
if (($day > 6) || ($day < 0)) {8Gh中国设计秀
throw new InvalidDayOfWeekException('The day number '' . $day . '' is an ' .8Gh中国设计秀
'invalid day of the week. Expecting 0-6.');8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
$dayNames = array(8Gh中国设计秀
"Sunday",8Gh中国设计秀
"Monday",8Gh中国设计秀
"Tuesday",8Gh中国设计秀
"Wednesday",8Gh中国设计秀
"Thursday",8Gh中国设计秀
"Friday",8Gh中国设计秀
"Saturday");8Gh中国设计秀
return $dayNames[$day];8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
echo("The name of the 0 day is: " . convertDayOfWeekToName(0) . "n");8Gh中国设计秀
8Gh中国设计秀
try {8Gh中国设计秀
echo("The name of the 10 day is: " . convertDayOfWeekToName(10) . "n");8Gh中国设计秀
} catch (InvalidDayOfWeekException $e) {8Gh中国设计秀
echo ("Encountered error while trying to convert value: " . $e->getMessage() . "n");8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
try {8Gh中国设计秀
echo("The name of the 'orange' day is: " . convertDayOfWeekToName('orange') . "n");8Gh中国设计秀
} catch (InvalidDayFormatException $e) {8Gh中国设计秀
echo ("Encountered error while trying to convert value: " . $e->getMessage() . "n");8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
?>8Gh中国设计秀

通过检验参数的全法性——这有助于他人使用你需要正确参数的函数——你应该检验它们并抛出异常的大意:8Gh中国设计秀

  • 尽量抛出接近错误的异常.
  • 处理每个特殊的异常.

永远,永远不要复制粘贴8Gh中国设计秀

把代码复制到你的编辑里的能力是一把双刃剑。一方面,它避免了你参照一些示例后重新再打一遍时出现的错误;另一方面,它让书写相似代码太简单了。8Gh中国设计秀

你要避免在你的程序应用中复制粘贴代码。当你发现自己在这样做时,停下来并问自己可不可以把复制的部分重复使用。把相同的代码放在同一个地方可以让你以后修改时更加的轻松,因为要改变都在一起。8Gh中国设计秀

坏习惯:相似的代码块8Gh中国设计秀

例9表现了除了一些值所在位置之外很相近的几个方法。有些工具可以检验你的代码中复制粘贴的部分(去看看Resources)。8Gh中国设计秀

例9.相似的代码块8Gh中国设计秀

 8Gh中国设计秀

<?php8Gh中国设计秀
/**8Gh中国设计秀
* Counts the number of messages found in the array of 8Gh中国设计秀
* ResultMessage with the getSeverity() value of "Error"8Gh中国设计秀
* 8Gh中国设计秀
* @param $messages An array of ResultMessage8Gh中国设计秀
* @return unknown_type8Gh中国设计秀
*/8Gh中国设计秀
function countErrors($messages)8Gh中国设计秀
{8Gh中国设计秀
$matchingCount = 0;8Gh中国设计秀
foreach($messages as $m) {8Gh中国设计秀
if ($m->getSeverity() == "Error") {8Gh中国设计秀
$matchingCount++;8Gh中国设计秀
}8Gh中国设计秀
}8Gh中国设计秀
return $matchingCount;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
/**8Gh中国设计秀
* Counts the number of messages found in the array of 8Gh中国设计秀
* ResultMessage with the getSeverity() value of "Warning"8Gh中国设计秀
* 8Gh中国设计秀
* @param $messages An array of ResultMessage8Gh中国设计秀
* @return unknown_type8Gh中国设计秀
*/8Gh中国设计秀
function countWarnings($messages)8Gh中国设计秀
{8Gh中国设计秀
$matchingCount = 0;8Gh中国设计秀
foreach($messages as $m) {8Gh中国设计秀
if ($m->getSeverity() == "Warning") {8Gh中国设计秀
$matchingCount++;8Gh中国设计秀
}8Gh中国设计秀
}8Gh中国设计秀
return $matchingCount;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
/**8Gh中国设计秀
* Counts the number of messages found in the array of 8Gh中国设计秀
* ResultMessage with the getSeverity() value of "Information"8Gh中国设计秀
* 8Gh中国设计秀
* @param $messages An array of ResultMessage8Gh中国设计秀
* @return unknown_type8Gh中国设计秀
*/8Gh中国设计秀
function countInformation($messages)8Gh中国设计秀
{8Gh中国设计秀
$matchingCount = 0;8Gh中国设计秀
foreach($messages as $m) {8Gh中国设计秀
if ($m->getSeverity() == "Information") {8Gh中国设计秀
$matchingCount++;8Gh中国设计秀
}8Gh中国设计秀
}8Gh中国设计秀
return $matchingCount;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
$messages = array(new ResultMessage("Error", "This is an error!"),8Gh中国设计秀
new ResultMessage("Warning", "This is a warning!"),8Gh中国设计秀
new ResultMessage("Error", "This is another error!"));8Gh中国设计秀
8Gh中国设计秀
$errs = countErrors($messages);8Gh中国设计秀
8Gh中国设计秀
echo("There are " . $errs . " errors in the result.n");8Gh中国设计秀
?>8Gh中国设计秀

好习惯:可复用的带参函数8Gh中国设计秀

例10展示了把要复制的代码入到一个方法中的代码修改。另一个修改的方法则把工作代理给了一个新的方法 。编写一个通用的方法要花一些时间来设计,当然这会让你停下来思考,而不是用复制粘贴的组合快捷键。但是这样做会在以后修改时省回第一次多花的时间。8Gh中国设计秀

例10.好习惯 :可利用的带参函数8Gh中国设计秀

 8Gh中国设计秀

<?php8Gh中国设计秀
/*8Gh中国设计秀
* Counts the messages with the given severity in the array8Gh中国设计秀
* of messages.8Gh中国设计秀
* 8Gh中国设计秀
* @param $messages An array of ResultMessage8Gh中国设计秀
* @return int Count of messages matching $withSeverity8Gh中国设计秀
*/8Gh中国设计秀
function countMessages($messages, $withSeverity)8Gh中国设计秀
{8Gh中国设计秀
$matchingCount = 0;8Gh中国设计秀
foreach($messages as $m) {8Gh中国设计秀
if ($m->getSeverity() == $withSeverity) {8Gh中国设计秀
$matchingCount++;8Gh中国设计秀
}8Gh中国设计秀
}8Gh中国设计秀
return $matchingCount;8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
/**8Gh中国设计秀
* Counts the number of messages found in the array of 8Gh中国设计秀
* ResultMessage with the getSeverity() value of "Error"8Gh中国设计秀
* 8Gh中国设计秀
* @param $messages An array of ResultMessage8Gh中国设计秀
* @return unknown_type8Gh中国设计秀
*/8Gh中国设计秀
function countErrors($messages)8Gh中国设计秀
{8Gh中国设计秀
return countMessages($messages, "Errors");8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
/**8Gh中国设计秀
* Counts the number of messages found in the array of 8Gh中国设计秀
* ResultMessage with the getSeverity() value of "Warning"8Gh中国设计秀
* 8Gh中国设计秀
* @param $messages An array of ResultMessage8Gh中国设计秀
* @return unknown_type8Gh中国设计秀
*/8Gh中国设计秀
function countWarnings($messages)8Gh中国设计秀
{8Gh中国设计秀
return countMessages($messages, "Warning");8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
/**8Gh中国设计秀
* Counts the number of messages found in the array of 8Gh中国设计秀
* ResultMessage with the getSeverity() value of "Warning"8Gh中国设计秀
* 8Gh中国设计秀
* @param $messages An array of ResultMessage8Gh中国设计秀
* @return unknown_type8Gh中国设计秀
*/8Gh中国设计秀
function countInformation($messages)8Gh中国设计秀
{8Gh中国设计秀
return countMessages($messages, "Information");8Gh中国设计秀
}8Gh中国设计秀
8Gh中国设计秀
$messages = array(new ResultMessage("Error", "This is an error!"),8Gh中国设计秀
new ResultMessage("Warning", "This is a warning!"),8Gh中国设计秀
new ResultMessage("Error", "This is another error!"));8Gh中国设计秀
8Gh中国设计秀
$errs = countErrors($messages);8Gh中国设计秀
8Gh中国设计秀
echo("There are " . $errs . " errors in the result.n");8Gh中国设计秀
8Gh中国设计秀
?>8Gh中国设计秀

 8Gh中国设计秀

结论8Gh中国设计秀

如果当你开发PHP的时候养成了本文中提到的好习惯,你写的代码将会好读、好懂、好维护。编写可维护代码的方式将让你的代码可以高度排错,并告别低级错误。8Gh中国设计秀

使用良好命名并用短代码块来组强你的代码会让你的代码简单明了。注明你代码的目的会让它的主旨明确易于理解。异常处理让你的代码健壮。最后,摒弃复制粘贴的恶习让你的代码整洁。8Gh中国设计秀

-----------------------------------------------------8Gh中国设计秀

玉米寄语:最后的这个复制粘贴的建议让我一身冷汗,想想其实有很多代码都是重复的工作,有时只是为了“快”,而把相似的代码又“复制”了一遍,虽然我没有使用ctrl+cv 但是也是写了很多类似的代码,看来,review的事儿可以在世界和平的事儿之前考虑了。8Gh中国设计秀

 
本文引用地址:/bc/article_65334.html
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明