|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
现在,也有了从事软件工程的想法,在经过了一个月的PHP培训学习之后,发现其实软件工程并没有想像中的那么难。函数 在本系列文章(有关若何在实践情形下开辟无效的 PHP 代码)的第 3 局部中,Amol Hatwar 会商了若何构建最无效的功效型函数,利用这些函数不会就义太多功能或可办理性。作者重点论述了若何编写可重用函数,并引见了若何防止与该义务相干的一些最多见成绩。
接待回来。在本系列文章的第 1 局部中,我会商了一些根基的 PHP 设计划定规矩,并引见了若何编写平安、复杂、与平台有关且疾速的代码。在第 2 局部中,我引见了变量,并会商了它们在 PHP 编码中的用法 ― 好的和坏的理论。
在本文中,您将懂得若何在 PHP 中明智地利用函数。在每种初级编程言语中,法式员都可以界说函数,PHP 也不破例。独一的区分在于,您不用忧虑函数的前往类型。
深切研讨
函数可用于:
将几行代码封装成一条语句。
简化代码。
最主要的是,将使用法式作为更小的使用法式互相调和的产品。
关于从编译言语(如 C/C++)转到 PHP 的开辟人员来讲,PHP 的功能级别是使人受惊的。在利用 CPU 和内存资本方面,用户界说的函数十分昂贵。这次要是由于 PHP 是注释型和松懈类型的。
包装与否
有些开辟人员仅仅由于不喜好函数的称号就把他们利用的每一个函数都包装起来,而另外一些开辟人员却基本不喜好利用包装。
包装现有的 PHP 函数而不添加或增补现有的功效,是完整不克不及承受的。除会增添巨细和履行工夫外,如许的重定名函数有时能够会带来办理上的噩梦。
代码中的内联函数会招致稀里糊涂的代码,乃至是更大的办理灾害。如许做的独一优点能够就是失掉一个更快的代码。
更明智的办法是,仅在需求屡次利用代码,而且关于您但愿完成的义务没有可用的内置 PHP 函数时才界说函数。您可以选择重定名或仅当需求时才无限制地利用。
图 1 中的图表粗略地显示了可办理性和速度与利用的函数数目之间的互相关系。(在此我没标明单元,由于数字取决于个别和团队的才能;这一关系是主要的可视数据。)
图 1. 可办理性/速度 Vs. 函数数目
定名函数
正如我在本系列文章的第 2 局部(请参阅参考材料)中提到的,要取得无效的代码办理,一直都利用公共的定名商定是必不成少的。
其它两个需求思索的理论是:
选择的称号应该能很好地提醒函数的功效。
利用标明包或模块的前缀。
假定您有一个名为 user 的模块,它包括用户办理函数,那末关于反省用户以后是不是在线的函数而言,诸如 usr_is_online() 和 usrIsOnline() 如许的函数称号都是上佳之选。
将下面的称号与 is_online_checker() 如许的函数称号比拟较。失掉的结论是,利用动词优于利用名词,由于函数一直城市做点甚么。
几何参数?
很有能够您将利用已机关的函数。即便情况并不是如斯,您能够也但愿最大化代码的利用局限。要做到这一点,您和其他开辟人员应该持续开辟易于利用的函数。没人喜好利用那些所带的参数既流畅又难于了解的函数,因而请编写易于利用的函数。
选择一个可以申明函数用处的称号(并削减函数利用的参数数目)是确保易于利用的一个好办法。参数数目的幻数是甚么呢?依我看来,超越三个参数就会使函数难以记忆。利用大批参数的庞杂函数几近都能被拆分红多个更复杂的函数。
没人喜好利用对付的函数。
编写优良函数
假定您但愿在将 HTML 文档放到阅读器之前设置文档的题目。题目就是 <head>...</head> 标志之间的一切内容。
假定您但愿设置 title 和 meta 标志。不利用 setHeader(title, name, value) 函数履行一切任务,而分离利用 setTitle(title) 和 setMeta(name, value) 完成各项任务是一个更佳的处理计划。该计划互相自力地设置 title 和 meta标志。
进一步思索,题目可以只包括一个 title 标志,但它可以包括多个 meta 标志。假如需求设置多个 meta 标志,则代码必需屡次挪用 setMeta()。在这类情形下,更佳的处理计划是将带着名称-值对的两维数组传递给 setMeta(),而且让函数轮回履行该数组 ― 同时履行一切操作。
普通来讲,象如许的同时的函数更可取。用函数需求处置的一切数据一次性挪用函数,一直优于屡次挪用函数,并以增量的体例为其供应数据。编写函数时的次要思惟是,尽可能削减从其它代码对其的挪用。
据此,setHeader() 处理计划其实不是好办法。不言而喻,咱们可以将 setHeader() 重组成 setHeader(title, array),然而也必需思索到咱们得到了互相自力地设置 title 和 meta 标志的才能。
另外,在实践情况中,题目能够包括多个标志,而不只是 title 和 meta 标志。假如需求添加更多标志,您必需更改 setHeader(),而且改动依附于它的一切其它代码。在后一种情况下,只需多编写一个函数。
上面的等式合用于一切编程言语:
便于记忆的称号 + 明晰的参数 + 速度和效力 = 在一切编程言语中都合用的优良函数
用分层的办法调和函数
函数很少是单独存在的。它们与其它函数配合起感化,互换和处置数据以完成义务。编写可与不异组或模块中的其它函数优秀协作的函数很主要,由于这些函数组或模块组就是您必需可以重用的。
让咱们持续设想的页面构建示例。这里,该模块的职责是用 HTML 构建一个页面。(如今让咱们先略细致节成绩和代码,由于示例的目标只是为了申明:在进步可重用性要素的同时,若何使函数和函数组便利地互相共同。)
从内置的 PHP 函数入手下手,您可以构建笼统函数,利用它们创立更多处置根基需求的函数,然后顺次利用这些函数构建特定于使用法式的函数。图 2 可让您懂得其任务道理。
图 2. 分层的函数
如今,先在内存中构建页面,然后将完成的页面分发给阅读器。
在内存中构建页面有两大优点:
可以用本人的剧本高速缓存已完成的页面。
假如未能胜利构建页面,可以放弃完成一半的页面,并使阅读器指向失足页面。
如今,您的用户将不会看到页面中有毛病动静的呈报了。
依据大多半页面的布局,需求将页面构建模块分红履行以下功效的函数:
绘制顶栏
绘制导航栏
显示内容
添加脚注
还需求履行下述功效的函数:
高速缓存页面
反省页面是不是已被高速缓存
假如页面已被高速缓存则显示它
让咱们称之为页面构建器(pagebuilder)模块。
页面构建器模块经由过程查询数据库履行其任务。因为该数据库是 PHP 以外的,所以将利用数据库笼统模块,其职责是为 PHP 中各类分歧的特定于供给商的数据库函数供应同类接口。该模块中的主要函数有:毗连数据库的函数、查询数据库的函数和供应查询了局的函数。
假定您还但愿完成一个站点局限的搜刮引擎。该模块将担任搜刮站点上与某个关头字或某组关头字相干的文档,并依据搜刮字符串的相干性或呈现该字符串次数最多来显示了局。假如您还但愿纪录搜刮以便停止审计,该模块将与数据库笼统模块一同利用。
请记住,您将承受来自用户的输出。您需求将其显示在屏幕上,并放弃那些看上去怀有歹意的内容。这需求另外一个模块,它担任验证用户经由过程表单提交的数据。
至此,您对我正在讲述的概念一定有了大致的懂得。必需将最中心的功效分化成逻辑模块,要履行它们的义务,使用法式必需利用这些模块供应的函数。
利用这类分层的办法,复杂的页面构建出现使用法式能够如图 3 所示。
图 3. 分层的页面构建使用法式
请注重,在本示例中,中心模块与处置使用法式的模块之间没有条理。也就是说,中心模块可以从上面的笼统模块或层中声明的函数挪用和声明函数,然而使用法式代码能够不克不及如许做。假如使用法式代码中的函数受任何低层函数“净化”或封装了任何低层函数,那末使用法式代码不该该声明这些函数。它只能利用低层的函数。这被证明是一个更快的办法。
功效型手艺
既然您已懂得了应若何利用和编写函数,那末就让咱们研讨一些经常使用的手艺。
利用援用
复杂点说,援用就象 C 言语中的指针。独一的区分在于,在 PHP 中,不需求象在 C 言语中那样利用 * 运算符来消除援用。您可以将它们当作是变量、数组或对象的别号。不管履行甚么操作,别号都将影响实践的变量。
清单 1 演示了一个示例。
清单 1. 变量援用
<?php
$name = 'Amol';
$nom = &$name; // $nom is now a reference to $name
$nom .= ' Hatwar';
print("Are you $name?n"); // Jimmy Ray parody?
?>
当将参数传递给函数时,函数吸收到参数的正本。只需函数一前往,您对参数所做的任何更改都将丧失。假如您但愿直接改动参数,这会是一个成绩。清单 2 演示了一个申明该成绩的示例。
清单 2. 将参数传递给函数时的成绩
<?php
function half($num)
{
$num = $num / 2;
return $num;
}
$myNum = 15;
$result = half($myNum);
print("The half of $myNum is: $resultn");
print("$myNum contains: $myNumn");
?>
咱们但愿直接改动 $myNum;经由过程将 $myNum 的援用传递给 half() 函数可以等闲地完成该任务。然而请记住,这并非个好理论。利用您代码的开辟人员必需跟踪所用的援用。这能够会在不经意间招致毛病舒展。它还会影响到的函数的易用性。
更好的理论是直接在函数声明中利用援用 ― 在咱们的例子中,利用 half(&$num) 取代 half($num)。如许,经由过程记住援用,您就不必记住要将参数传递给函数了。
PHP 处置幕后的一些工作。较新的 PHP 版本(从 4.0 起的后续版本)不同意在挪用时按援用传递,而且不管若何城市收回正告。(这里有一些建议:假如您正在利用针对初期 PHP 版本编写的代码,那末最好更新代码,而不是经由过程改动 php.ini 文件来更改 PHP 的行动。)
保存函数挪用之间的变量
经常需求保护函数挪用之间的变量值。可使用全局变量,然而变量十分懦弱,并能够被其它函数损坏。咱们但愿变量关于函数而言是部分变量,并依然保存其值。
利用 static 关头字是一个很好的处理计划。当我但愿盘算在没法利用调试器的情形下有几何用户界说的函数被履行时,我常利用这类办法。我只是改动了一切函数(固然是利用主动化的剧本),并在函数体的第一行添加了对履行计数任务的函数的挪用。清单 3 描写了该函数。
清单 3. 计数用户界说的函数
function funcCount()
{
static $count = 0;
return $count++;
}
恰好在剧本完成之前经由过程挪用 funcCount() 来搜集变量中的前往值,这类办法是无效的。使人受惊的是,$count 没有复位为零;初始化静态变量的行只履行了一次。
假如您必需会见函数中的全局变量,那末在利用变量前您需求利用 global 关头字。
从 PHP 4 入手下手还可以如许做 ― 先利用函数,然后再界说它,只需您不会试图声明该函数两次便可。
履行静态挪用
在很多情况中,您会发明实践上您其实不晓得接着必需挪用哪一个函数。当您在停止事务驱动的编程时,或当您但愿在触发了体系外的某一事务时挪用特定函数时,就会呈现这类情况。经由过程收集停止通讯的剧本就是这类情况的例证。
该办法相似于利用变量名。只需利用内部事务来设置变量,而且利用它作为函数(假定您已声了然对应的函数)。有些利诱吗?清单 4 做了廓清。
清单 4. 静态函数挪用
<?php
function say_hi()
{
print("Hi! ");
}
function say_greeting()
{
print("How are you today?n");
}
function say_bye()
{
print("Enough functions for the day, I hope to see you again next month.n");
print("Till then, have a good timen");
}
// Lets pretend someone just logged in
$my_func = 'say_hi';
$my_func();
// Greet the user
$my_func = 'say_greeting';
$my_func();
// Call it a day
$my_func = 'say_bye';
$my_func();
?>
当您想省事时,也能够利用该办法编写几条 switch-case 语句,以评价要利用哪一个函数。只需设置变量并利用它作为函数。虽然这里咱们居心设置了变量,然而请记住,可以静态完成该任务,而这才显示了该手艺的功效是何等壮大。
停止语
在本文中,咱们论述了若何设计和编写优良函数。咱们演示了若何使模块和剧本集互相共同,以制造更大的使用法式,咱们还研讨了可以削减编码任务并生成极佳代码的手艺。
鄙人一篇文章中,咱们将申明 PHP 中的类和对象,以以后的妙技为基本来停止构建,而且细心研讨一些履行高速缓存和数据库笼统的代码。
参考材料
在 Developer Shed 的“The Art Of Software Development: Understanding Need”一文中,icarus 侧重引见了使用法式开辟周期的第一局部,论述了在您坐上去编写第一行代码前必需做的一些工作。
请浏览 Developer Shed 上 Harish Kamath 的教程“Using PHP with Java”;该教程包括详实的申明性代码示例,它们已在带有 JDK 1.3.0、Apache 1.3.20 和 PHP 4.1.1 的 Linux/i586 上测试过。
Mike Britton 的文章“Scratching the Surface: Getting Started with PHP Fusebox”,完全地引见了最新的 Fusebox 版本 ― 它是一个可伸缩的且无效的 Web 盒款式的系统架构东西。
PHPGuy 供应了一篇教程“Useful PHP Functions To Build Your PHP Toolkit”,供应了 10 种不平常的函数,在使用 PHP 编码的时分,您可使用这些函数节俭工夫。
仍是出自 PHPGuy 的文章:“Making Sense of Those Cold PHP Errors!”申明了几种 PHP 毛病类型,和若何在开辟时代弄清它们的寄义。
PHP Debugger 可(收费)用于 PHP 代码的概要剖析和调试。
本系列的第 1 局部“高高在上”(developerWorks,2002 年 8 月)会商了若何为把握 PHP 打下坚实的基本。
本系列的第 2 局部“无效地利用变量”(developerWorks,2002 年 9 月)展现了若何经由过程机关设置装备摆设文件解析器(利用分歧的变量名)使剧本设置装备摆设变得复杂。
请会见 dW Linux 专区以获得更多参考材料。
关于作者
Amol Hatwar 从能记事起就入手下手接触盘算机。作为 GNU/Linux 的相对反对者,他为曩昔在 Microsoft 平台上编程感应忸怩。他如今作为自力参谋匡助浩瀚公司迁徙到 GNU/Linux。作为开辟 Web 使用法式范畴的专家,他把所剩无几的空余工夫花在研讨没人传闻过的手艺上。他如今的乐趣包含开放源码软件、Web 办事、对等盘算和高可用性群集。
对于PHP的语法结构,刚开始真的很不习惯,真搞不懂为什么每个变量之前都要加个“$”符号,每个语句写完之后都必须加上“分号”来表示此句已经结束,还有,PHP对字母的大小写是敏感的,写的时候一定要注意大小写的区别。 |
|