EdoJS组件库代码开放下载! 66个组件!

2010/09/28

截至2010年8月1号, EdoJS总计开放66个组件库代码, 分类如下:

管理器类managers:
DragManager ResizeManager PopupManager TipManager SystemManager
导航器类navigators:
Menu TabBar PagingBar VTabBar ToggleBar Navigator
数据类data:
DataTable DataTree DataForm Convert Connection
核心类core:
MessageBox Module Validator Space Split HSplit
组件类controls:
Button TextInput ComboBox AutoComplete CheckBox CheckGroup CodeEditor Date DatePicker
DateSpinner DurationSpinner Error FileUpload HtmlEditor Label Lov MultiCombo  SuperSelect
Password PercentSpinner Progress Radio SWF RadioGroup ScrollBar Search Slider Spinner MultiSelect
TextArea TimeSpinner TreeSelect Trigger VScrollBar VSlider

 可以去这里下载:  http://bbs.edojs.com/viewthread.php?tid=155

现在就可以了解到EdoJS的66个组件源代码!

EdoJS是一个简单、强大的JS框架!通过如下资源了解我们:

    DEMO: http://www.edojs.com/demo

    IDE:    http://www.edojs.com/ide

    教程:   http://www.edojs.com/tutorial

    API:    http://www.edojs.com/api

    甘特图:http://www.edogantt.com

    可视化开发视频: http://bbs.edojs.com/viewthread.php?tid=134

    已有超过60家企业使用EdoJS! 这里查看:

    http://bbs.edojs.com/viewthread.php?tid=59

 支持EdoJS的朋友,我们提供了免费授权(名额不多了),让您无门槛使用EdoJS!更放心使用EdoJS!

    http://bbs.edojs.com/viewthread.php?tid=59


置疑EdoJS的朋友,我们提供了组件库代码下载,您可以了解我们的代码实现,看EdoJS是否是一个具有原创组件架构和编程思想的产物!

    http://bbs.edojs.com/viewthread.php?tid=155

在javascript框架的历史上, 国内外, 只有EdoJS一家做到了这种程度的web可视化设计器效果: http://www.edojs.com
这里直接体验edojs的DEMO: http://www.edojs.com/demo

你也可以参与到这个IDE的完善和扩展工作中, 这个IDE的实现代码可以在这里下载: http://edojs.com/download.php

edojs现在有免费授权活动, 以及开放组件库代码: http://bbs.edojs.com/viewthread.php?tid=59&

让您没有门槛, 拥有足够的资源去了解和使用EdoJS!
并参与到EdoJS的不断完善和扩展工作中来!

写给设计人的10个jQuery特效

2010/09/24

jQuery已经不是什么新鲜的事儿,记得第一次听说是在catch the digital flow上。总把它认为是非常难的东西,也就没有认真去了解他了。直到学完CSS的大部分内容,才开始接触这种”write less, do more” 的Javascrīpt框架。今天,这篇文章的最重要内容是来自Web Designer Wall的一篇教程,一篇包含了10个jQuery特效的教程。这里不打算全文翻译,想以自己的语言来表达,或许这样更方便大家理解/自己以后学习,也可能更准确地描述。

提示:教程中所用的 jQuery 版本为1.2.3。这篇文章是为jQuery新手而写的。

先试试看? View jQuery DemosDownload Demo ZIP

jQuery是如何工作的?

首先,你需要下载一个jQuery版本,并将它插入到<head>标签内。然后,你将需要写函数来告诉jQuery做些什么,下面的这个图表将告诉你jQuery是怎样工作的(点击图片,查看大图):

jquery-how-it-works

如何获取元素(Get the element)?

书写 jQuery 函数是一个非常简单的事(多亏了精彩的说明书)。关键是你要学习如何获取你想要实现的效果的确切元素。

  • $("#header") = 获取 id=”header” 的元素
  • $("h3") = 获取所有<h3>
  • $("div#content .photo") = 获取<div id=”content”>里所有用class=”photo”定义的元素
  • $("ul li") = 获取所以 <ul> 中 <li> 的元素
  • $("ul li:first") = 只获取<ul>中第一个<li>

1. 简单的下拉面板

让我们来开始这个简单的下拉面板特效吧(view demo),或许你已经见过很多次,现在,自己试试吧:

sample1

当包含class=”btn-slide”的元素被点击,它会下拉/上提<div id=”panel”>里的元素。然后切换到CSS中的class=”active”到<a>元素。.active 将会以CSS的方式打开/关闭出面板。

$(document).ready(function(){

	$(".btn-slide").click(function(){	  $("#panel").slideToggle("slow");	  $(this).toggleClass("active");	});

});

2. 简单的隐藏效果

如图,当右上角的上图标被点击时,内容被隐藏。效果可以看Demo (view demo)

sample2

当被定义为 <img> 的图片被点击,它会手找到父级元素 <div> 并激活它的能力,慢慢消失,隐藏起来。

$(document).ready(function(){

	$(".pane .delete").click(function(){	  $(this).parents(".pane").animate({ opacity: "hide" }, "slow");	});

});

3 连续过渡效果

让我们来看看jQuery连贯性的威力吧。只需要几行代码,我能让这个方块渐变+缩放比例地飞来飞去(view demo)

multi-animation

Line 1: 当 <a> 被点击
Line 2: 激活 <div id=”box”> 的不透明度(opacity)=0.1,直到值达到400px,速度达到1200px/ms
Line 3: 当opacity=0.4, top=160px,height=20,width=20,以”slow”显示
Line 4: 当opacity=1, left=0, height=100, width=100,也以”slow”显示
Line 5: 当opacity=1, left=0, height=100, width=100, 也以”slow”显示
Line 6: 当top=0, 以”fast”显示
Line 7: 然后,以常速上滑 (default speed = “normal”)
Line 8: 然后以”slow”下滑
Line 9:返回失效会阻止浏览器跳向链接锚点

$(document).ready(function(){

	$(".run").click(function(){

	  $("#box").animate({opacity: "0.1", left: "+=400"}, 1200)	  .animate({opacity: "0.4", top: "+=160", height: "20", width: "20"}, "slow")	  .animate({opacity: "1", left: "0", height: "100", width: "100"}, "slow")	  .animate({top: "0"}, "fast")	  .slideUp()	  .slideDown("slow")	  return false;

	});

});

4a. 可折叠的模式 #1

这是第一个可折叠的样式, (view demo)

sample3

第一行将向<div> 内的第一个<H3> 添加一个CSS class为”active”的值。 第二行刚是隐藏<div>内非第一个< p >的内容。

当 <h3> 被点击时,当前<p>下拉,而原先下拉的<p> 上提。

$(document).ready(function(){

	$(".accordion h3:first").addClass("active");	$(".accordion p:not(:first)").hide();

	$(".accordion h3").click(function(){

	  $(this).next("p").slideToggle("slow")	  .siblings("p:visible").slideUp("slow");	  $(this).toggleClass("active");	  $(this).siblings("h3").removeClass("active");

	});

});

4b. 可折叠模式 #2

这个实例与#1非常类似,不过,它会让指定的面板像默认面板一样打开(view demo)

在CSS样式表中,设置.accordion pdisplay:none。现在,如果你像默认打开的样式一样,打开第三个面板,你可以写$(".accordion2 p").eq(2).show(); (eq = equal)来实现它,需要注意的是起始点是”0″,而不是”1″,所以,第三个相应的是”2″,而不是”3″。

$(document).ready(function(){

	$(".accordion2 h3").eq(2).addClass("active");	$(".accordion2 p").eq(2).show();

	$(".accordion2 h3").click(function(){	  $(this).next("p").slideToggle("slow")	  .siblings("p:visible").slideUp("slow");	  $(this).toggleClass("active");	  $(this).siblings("h3").removeClass("active");	});

});

5a. 鼠标经过激活效果 #1

这个将会实现一个非常漂亮的,当鼠标经过时出现渐变出现的效果 (view demo)

sample4

当鼠标经过菜单时,它会寻找紧接着的<em>,并在上方激活它的不透明度。

$(document).ready(function(){

	$(".menu a").hover(function() {	  $(this).next("em").animate({opacity: "show", top: "-75"}, "slow");	}, function() {	  $(this).next("em").animate({opacity: "hide", top: "-85"}, "fast");	});

});

5b. 鼠标经过激活 #2

这个实例会显示菜单中链接的title 属性attribute,让其以变数方式存在,并添加<em>标签 (view demo)

sample4b

第一行会添加一个空的<em>到菜单的<a>元素。

当鼠标经过菜单链接时,它会显示title的属性,让它以”hoverText(隐藏)”的形式显示,并使<em>中的文字显示隐藏文本的值。

$(document).ready(function(){

	$(".menu2 a").append("<em></em>");

	$(".menu2 a").hover(function() {	  $(this).find("em").animate({opacity: "show", top: "-75"}, "slow");	  var hoverText = $(this).attr("title");	  $(this).find("em").text(hoverText);	}, function() {	  $(this).find("em").animate({opacity: "hide", top: "-85"}, "fast");	});

});

6. 整块可点击性效果

这个实例将会教你如何实现内容中元素可点击性效果,Best Web Gallery的侧边栏Tab就显示这样的效果 (view demo)

sample5

如果你想让class=”pane-list”的<ul>内的 <li> 可点击(整块),你可以向 “.pane-list li”指派一个函数,使它被点击时,函数找到 <a>元素,重定向到它的href属性值。

$(document).ready(function(){

	$(".pane-list li").click(function(){	  window.location=$(this).find("a").attr("href"); return false;	});

});

7. 可收缩面板

让我们组合一下上面的实例,创造一给可收缩的面板(像Gmai收件箱面板l)。作者还在Web Designer Wall 的评论列表Next2Friends里应用这个(view demo)

sample6

First line: 隐藏<div>里第一个元素以后的元素
Second line: 隐藏所有第5个<li>后面的元素
Third part: 当<p>被点击里,显示/隐藏<div>
Fourth part: 当<a> 被点击时,上提所有<div>的元素
Fifth part: 当<a> 被点击,隐藏它,并显示<a>,并下拉第5个<li>以后的元素
Sixth part: 当<a> 被点击时,隐藏它,并显示<a>,并上提第5个 <li>以后的元素

$(document).ready(function(){

	//hide message_body after the first one	$(".message_list .message_body:gt(0)").hide();

	//hide message li after the 5th	$(".message_list li:gt(4)").hide();

	//toggle message_body	$(".message_head").click(function(){	  $(this).next(".message_body").slideToggle(500)	  return false;	});

	//collapse all messages	$(".collpase_all_message").click(function(){	  $(".message_body").slideUp(500)	  return false;	});

	//show all messages	$(".show_all_message").click(function(){	  $(this).hide()	  $(".show_recent_only").show()	  $(".message_list li:gt(4)").slideDown()	  return false;	});

	//show recent messages only	$(".show_recent_only").click(function(){	  $(this).hide()	  $(".show_all_message").show()	  $(".message_list li:gt(4)").slideUp()	  return false;	});

});

8. 模仿WordPress后台评论管理面板

我想你可能见过最多次这个效果是在Wordpress后台的评论管理面板。那好,让我们来用jQuery来模仿它的效果。为了实现背景颜色,你需要包含Color Animations这个插件(view demo)

sample

First line: 向<div> 添加 “alt” class
Second part: 当<a>被点击,激活<div>的不透明度
Third part: 当<a>被点击, 首先让<div>显示黄色,然后变为白色,并添加类(addClass)”spam”
Fourth part: 当<a>被点击,首先让<div>显示绿色,然后变为白色,并移除类(removeClass)”spam”
Fifth part: 当<a>被点击,激活背景色为red并使其opacity =”hide”

//don't forget to include the Color Animations plugin//<script type="text/javascript" src="jquery.color.js"></script>

$(document).ready(function(){

	$(".pane:even").addClass("alt");

	$(".pane .btn-delete").click(function(){	  alert("This comment will be deleted!");

	  $(this).parents(".pane").animate({ backgroundColor: "#fbc7c7" }, "fast")	  .animate({ opacity: "hide" }, "slow")	  return false;	});

	$(".pane .btn-unapprove").click(function(){	  $(this).parents(".pane").animate({ backgroundColor: "#fff568" }, "fast")	  .animate({ backgroundColor: "#ffffff" }, "slow")	  .addClass("spam")	  return false;	});

	$(".pane .btn-approve").click(function(){	  $(this).parents(".pane").animate({ backgroundColor: "#dafda5" }, "fast")	  .animate({ backgroundColor: "#ffffff" }, "slow")	  .removeClass("spam")	  return false;	});

	$(".pane .btn-spam").click(function(){	  $(this).parents(".pane").animate({ backgroundColor: "#fbc7c7" }, "fast")	  .animate({ opacity: "hide" }, "slow")	  return false;	});

});

 

9. 轮换图片展栏

如果你有一个项目需要显示多个图片,并且你不希望链向另一个页面,那么你可以在当前面加载目标链接的JPG(view demo)

sample8

首先,添加一个<em>到H2标签。

当<p>内的元素被点击:
– 以可视的形式显示href属性的”largePath”路径
– 以可视的形式显示title 属性的”largeAlt”
– 代换<img id=”largeImg”>的scr属性内可视的”largePath”路径,并代换alt属性内可视的”largeAlt”
– 设置em内的内容(h2内) 为可视的largeAlt

$(document).ready(function(){

	$("h2").append('<em></em>')

	$(".thumbs a").click(function(){

	  var largePath = $(this).attr("href");	  var largeAlt = $(this).attr("title");

	  $("#largeImg").attr({ src: largePath, alt: largeAlt });

	  $("h2 em").html(" (" + largeAlt + ")"); return false;	});

});

10. 个性化不同的链接样式

在现代化的浏览器中,个性化不同的链接是非常容易的事,比如想让.pdf文件显示特殊的样式,你只需要添加上简单的CSS规则:a[href $='.pdf'] { ... }就可以实现,但不幸的是IE6并不支持这个。如果想实现这个,你可以利用jQuery (view demo)

sample9

前三行代码必需是连续的,它只是一个<a>的href属性中的一个CSS class。

第二部分将会获取所有href中没有”http://www.webdesignerwall.com&#8221; 和/或没有”#”的< a>元素,并添加”external” class和target= “_blank”。

$(document).ready(function(){

	$("a[@href$=pdf]").addClass("pdf");

	$("a[@href$=zip]").addClass("zip");

	$("a[@href$=psd]").addClass("psd");

	$("a:not([@href*=http://www.webdesignerwall.com])").not("[href^=#]")	  .addClass("external")	  .attr({ target: "_blank" });

});

10个最佳的jQuery实用教程

2010/09/24

jQuery可以说已经是无所不在。不过,对于不懂JS的人来说,运用起来还是相当有难度的,所以,像PS一样,都会从网上找一些教程,手把手教,一点一点学。比如上次说到的写给设计人的10个jQuery特效都是手把手教的。今天这个jQuery教程也不例外,除了第一个是预览页的,其他都是手把手教的。

1. 标签式导航

2848373300_0249d4bb4b_o.jpg

2. 平滑移动导航

2848373306_c9a24450bd_o.jpg

3. 滑动导航

2848373310_ab4949c48d_o.jpg

4. jParallax (很酷的效果,眼人的视角一样)

2848373314_5989771696_o.jpg

5. Fancy-Zoom(放大效果,很漂亮)

2848373318_954e120c48_o.jpg

6. jQzoom (局站放大,厉害)

2848373322_efed88744f_o.jpg

7. Text-Zoom(文字放大)

2848378268_14e4ece156_o.jpg

8. 高亮背景

2848378274_69d3b48f04_o.jpg

9. jQeury 图表

2848378276_82c7eae81a_o.jpg

10. 可作装饰展栏

2848378280_bbc1bd271a_o.jpg

30+ 最新强大的jQuery插件和教程

2010/09/24

教程

1. How to add preloader with loading image in a gallery using jQuery

在图像画廊载入过程中使用 jQuery 预加载技术。演示 | 教程

2. Simple Lava Lamp Menu Tutorial With jQuery

创建一个独特的熔岩灯动画效果的 jQuery 导航菜单。演示 | 教程

3. How To Create a 3D Tag Cloud in jQuery

使用 jQuery 创建类似 Flash 形式的 3D 标签云。演示 | 教程

4. Drag & Drop With jQuery

Web 应用程序的拖放功能提供了丰富的用户界面,了解如何使用 jQuery 来创建此种用户界面。演示 | 教程

5. Awesome Horizontal Animated menu using Kwicks for jQuery

使用 jQuery Kwicks 插件建立一个可定制的,灵活的横向动画菜单。演示 | 教程

6. Create a Thumbnail Gallery With Slick Heading & Caption effect

使用光标题和字幕效果创建缩略图画廊。演示 | 教程

7. Create an Attractive jQuery Menu with fade in and out effects

创建一个有吸引力的 jQuery 菜单,鼠标悬停时具有淡入背景效果。演示 | 教程

8. jQuery PHP AJAX Autosuggest

Autosuggest 是目前的 Web 应用程序中一个有用的功能。了解如何使用 jQuery 和 PHP 来创建。演示 | 教程

9. Perfect Login Drop Down Box Like Twitter

使用 jQuery 模仿 twitter 新的下拉框效果。演示 | 教程

10. Crafting an Animated Postcard With jQuery

仅使用 jQuery 创建一个类 Flash 的明信片。演示 | 教程

11. Twitter like Search With jQuery & AJAX

使用 ajax 在同一页创建类似 Twitter 的搜索框加载结果。演示 | 教程

12. Voting System With jQuery, AJAX, PHP

学习如何创建类似 dzone 的投票系统。演示 | 教程

13. AJAXed Sliding Shopping Cart Using jQuery

创造一个 Ajax 滑动门效果的购物篮,当更新购物车项目时滑动,并在一段时间后自动隐藏。同时还支持手动显示隐藏选项,以便在任何时候查看购物车。演示 | 教程

14. How To Build Animated Header in jQuery

利用 jQuery 技术为网页标题添加令人轻叹的动画背景效果。演示 | 教程

15. Hide and Seek With jQuery

使用 jQuery 在单一页面上,显示基于事件行为的应用程序的多个模块。演示 | 教程

16. jQuery Comment Preview

通过使用 jQuery 为用户提供实时评论预览功能。演示 | 教程

17. Styling Drop Down Boxes With jQuery

由于选择框很难使用 CSS 来定义样式,本教程将告诉你如何使用文本框和无须列表代替选取框,然后根据需要定义样式。演示 | 教程

18. Scrolling Dynamic Content Box

使用 Ajax 将内容加载至滚动 DIV。就像谷歌阅读器中当你向下滚动时,会自动加载更多项目。演示 | 教程

19. Ways To Debug your jQuery or JavaScript Code

本文介绍了如何使用 jQuery 控制台登录来轻松地调试 JavaScript 代码。教程

20. 5 Ways To Make AJAX Calls with jQuery

关于使用 jQuery 技术以不同方式创建 Ajax 请求。甚至对那些已深度熟悉 jQuery 并且用大量方法创建 Ajax 请求的开发者也很有帮助。演示 | 教程

插件

1. Tipsy

呈现 Facebook 风格的工具提示插件,基于定位标记的标题属性。演示 | 插件主页

2. jQuery YouTube PlayList

将 YouTube 链接列表转换为播放列表,让用户能够在网页本身浏览视频。演示 | 插件主页

3. SuperFish Menus

Superfish 菜单是一款易于使用的 jQuery 插件,可以将无须 html 列表转换成漂亮的下拉菜单。插件主页

4. Elastic

Elastic 是一款轻量级的 jQuery 插件,可使 textareas 根据内容大小自动调整尺寸。演示 | 插件主页

5. OverScroll

在网页上实施类似 iphone 的拖放滚动效果。插件主页

6. Tweetable

使用 Tweetable 轻松快捷地在网页上显示 Twitter Feed 源,可选择将 Twitter 用户名和 URL 地址转换为超级链接。演示 | 插件主页

7. jQuery Link nudge

使用 jQuery Link Nudge 插件创建移动菜单栏,效果很漂亮。演示 | 插件主页

8. TimePickr

如果需要将用户系统时间作为表单输入,使用此插件可以提供丰富的用户界面,以便输入时间。插件主页

9. Truncatable

Truncatable 允许你在网页中隐藏文本块,并在需要时显示。演示 | 插件主页

10. Incremental Search For Select Boxes

此插件将普通的选择框转换成带有增量搜索的组合框,如果选择框有很多选项,这会非常有用。演示 | 插件主页

11. Anything Slider

Anything Slider 是一款功能齐全的滑动门插件,易于定制并适应你的网站。演示 | 插件主页

英文原文:30+ Fresh & Amazing jQuery Plugins & Tutorials | Web Developer Plus

EdoJS,简单、强大的JS框架!

2010/09/24

EdoJS是一个跨浏览器的富客户端界面框架解决方案。它的设计目标是为了让人们用最简单的方式,快速开发出丰富、健壮、高性能的跨浏览器Web应用程序。EdoJS是使用JS开发的,所以它跟服务端平台无关。通过Ajax数据交互方式,可以支持多种服务端平台,如ASP.NET、ASP、PHP、JSP、ColdFusion、Ruby on Rails等。

主要特性:

  • 易学易用:10分钟即可掌握EdoJS的编程精髓!
  • 强大的功能、丰富的组件库:已有超过60个组件和100个示例,并且不断增加中。
  • 代码体积小,内存占用少,运行速度快:卓越的架构和发挥到极致的DOM编程控制,使EdoJS达到浏览器所能的的极限!
  • 超强的列表系列:做到极致的表格Table、树形Tree,甚至TreeGrid等
  • 美观、百搭的界面:只需要编码,即获得专业、精美的界面
  • 跨服务端平台支持:支持多种服务端平台,如ASP.NET、ASP、PHP、JSP、ColdFusion、Ruby on Rails等。
  • 跨浏览器支持:一次编码,处处运行!
快速了解:

8大因素影响百度排名

2010/09/24

      要想在百度上面取得一个好的排名并不是大家所想象的那么困难,但是也不是那么的容易,所以就需要大家对百度排名算法有深入的了解。

  1、网站的外部链接

  外部链接对于任何搜索引擎来说都是比较重要的。

  2、网页title、标题是关键词的浓缩(必须包含要搜索的词,越精确越好)网站标题(<title>)、文章标题(<h1>)中一定要包含关键词,越精确影响越大,几乎是决定作用。

  3、网站的建站年龄

  网站的建站年龄越长被百度赋予的权重越高,网站年龄在排名中影响很大。网站的年龄从网站被百度收录时间开始算起。例如:域名注册期为2008.03.11,而正式启用并被百度收录的日期是2008.03.25,那么到现在网站的年龄还不到2个月。

      4、网站规模,网站板块及文章数量

  百度从来对大网站尤其信任。分类板块越多,板块下的内容越充实,百度给予的权重越高。

  5、域名后缀也是比较重要的

通常不同的域名类型百度也给予不同的权重,依次是:.edu,.gov,.org,.com,.net,.cn,所以有条件的还是申请好一些的域名。

      6、域名是否包含关键字(中文表现为拼音或直译英文单词)

  7、网站类型也很重要

  例如:政府、学校、媒体等类型网站权重相对较高,相关性、暴力、药品XXX等敏感话题的网站不收录或权重极低

  8、网站代码尽可能规范

  比如要完整,通过W3验证的网站一定会很受搜索引擎欢迎的。另外一点就是百度人工干预的几率很大,做好本职工作,千万不能作弊,特别是关键字堆砌。

Google 10 大免费关键字分析工具

2010/09/24

SEO 很大程度上是关键字的优化,君不见不少 SEO 网站(例如 WordTracker) 都是靠关键字分析赚钱?要钱的互联网产品我没有多大的兴趣,因为凡是要钱的互联网产品,基本上都有免费的盗版品或者替代品。SEO 嘛,就是为了讨好搜索引擎,甚至可以说是为了讨好 Google,所以我认为最好是从 Google 身上去研究关键字。不研究不知道,一研究吓一跳,原来 Google 居然至少有 10 个工具(或者说产品)是可以用来研究关键字的。这 10 个工具分别是:

1、Google AdWords 关键字工具

Google AdWords 关键字工具

Google AdWords 关键字最好用,支持中文关键字的分析,分析结果包括 “估算平均每次点击费用”、“本地搜索量”、“搜索量趋势”等多种数据。

2、Goolge 趋势

google 趋势

Google 趋势利用图表的形式展示所搜索的关键字搜索量的变化趋势,很直观。

3、Google News

Google News

Google News 可以显示某些关键字某年某月的搜索结果数量。

4、Google 关于搜索的关键字工具

Goole 关于搜索的关键字工具

这个工具主要是供 AdWords 的用户参考关键字定位和定价用的,但是其分析结果中的 “搜索量”、“竞争度”等信息对站长定位关键字也有帮助。

5、Goolge Insights for Search

Google Insights for Search

Google Insights 的主要作用是分析某个关键字在某个地区某个行业某个时间里的搜索概况,数据都是以百分比的形式显示。不过 Google Insights for Search 目前没有中文版。

6、Google Sets

Google Sets

Google Set 目前还处于测试阶段,没有中文版,它的作用是预测某几个同类关键字(例如宝马和奔驰)的其他同类关键字(例如奥迪、保时捷等),这样搜索者就可以知道同行里面有多少个竞争者。

7、Google 点击量估算工具

Google 点击量估算工具

Google 点击量估算工具的分析数据包括关键字的 “搜索量”、“估算平均每次点击费用”、“估算的每天点击量”,等等。

8、Google Analytics

Google Anylitics

Google Analytics 可以分析目标网站哪些关键字比较受欢迎,对后续关键字或者话题写作有帮助。

9、Google 网站管理员工具

Google 网站管理员工具

Google 网站管理员工具会对目标网站内的关键字的展示次数和点击率进行排名。

10、Google 快讯

Google 快讯

虽然 Google 快讯有时候会给你发一些和关键字毫不相干的快讯,但是只要设好几个关键字,然后 Google 就会收集并发送相关的资讯到自己的邮箱或者 Google Reader,那也不失为一种很好的研究方法。

原创文章,转载请注明: 转载自精品博客

PHP面向对象的方法重载

2010/09/24

预备知识:“重载”的概念

  “重载”是类的多态的一种实现。函数重载指一个标识符被用作多个函数名,且能够通过函数的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。这样做的主要好处就是,不用为了对不同的参数类型或参数个数,而写多个函数。多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数。

  PHP4 中仅仅实现了面向对象的部分的、简单的功能,而 PHP5 以后对对象的支持就强大的多了。

  对于多态的实现,PHP4 只支持覆盖(override),而不支持重载(overload)。但我们可以通过一些技巧来“模拟”重载的实现。

  PHP5 虽然可以支持覆盖和重载,但重载在具体实现上,和其他语言还有较大的差别。

  1,在 PHP4 中“模拟”重载

  试看以下代码:

  <?php

   //根据参数个数选择执行不同的方法(在 PHP4 中模拟”重载”(多态的一种)

   class Myclass

   {

    function Myclass()

    {

     $method = “method” . func_num_args();

     $this->$method();

    }

    function method1($x)

    {

     echo “method1”;

    }

    function method2($x, $y)

    {

     echo ‘method2’;

    }

   }

   //通过在类中的额外的处理,使用这个类对用户是透明的:

   $obj1 = new Myclass(‘A’); //将调用 method1

   $obj2 = new Myclass(‘B’,’C’); //将调用 method2

  ?>

  以上代码中,通过在构造函数中使用 func_num_args() 函数取到参数的个数,自动执行 method1 或 method2 方法。我们可以结合函数 func_get_arg(i) 和 func_get_args() 对以上示例进行改进。

  2,在 PHP5 中使用重载

  先看以下示例:

  <?php

   class Myclass

   {

    public $attriable;

    public $one = “this is one”;

    public $two = “this is two”;

    function __construct()

    {

    }

    function one($one)

    {

     $this->one=$one;

     $this->attriable = $this->one;

    }

    function one($one, $two)

    {

     $this->one=$one;

     $this->two=$two;

     $this->attriable = $this->one . $this->two;

    }

    function display()

    {

     echo $this->attriable;

    }

   }

   $one = “this is my class”;

   $two = “Im the best”;

   $myclass = new myclass();

   $myclass->one($one);

   $myclass->display();

   $myclass->one($one, $two);

   $myclass->display();

  //本例的做法,在 PHP 中是不正确的!

  ?>

  使用过 C++、Java、C# 重载的人,很习惯地就会写出以上的重载实现的 PHP 代码。但这在 PHP5 中是不正确的。PHP5 并不是对前述几种语言的模仿,而是有自己的一套实现方法重载的方法(是好是坏,这里不讨论)。  虽说 PHP5 的类较 PHP4 强大了许多,但是在“重载”这个问题上并

没有像我们预期的那样“改善”。在“强”类型的语言中可以通过不同的参数类型来实现“重载”,比如C++、Java、C# 等。在“固定参数”传递的语言中,还可以通过参数的个数进行传递,比如 Java,但是 PHP 是弱类型语言,因此不会出现类似以上的“重载”。

  PHP5 中重载可以通过 __get, __set, and __call 几个特殊方法来进行。当 Zend 引擎试图访问一个成员并没有找到时,PHP将会调用这些方法。

  在以下示例中,__get和__set代替所有对属性变量数组的访问。如果必要,你还可以实现任何类型你想要的过滤。例如,脚本可以禁止设置属性值, 在开始时用一定的前缀或包含一定类型的值。__call 方法说明了你如何调用未经定义的方法。你调用未定义方法时,方法名和方法接收的参数将会传给__call方法, PHP传递__call的值返回给未定义的方法。

  <?php

   class Overloader

   {

    private $properties = array();

    function __get($property_name)

    {

     if(isset($this->properties[$property_name]))

     {

      return($this->properties[$property_name]);

     }

     else

     {

      return(NULL);

     }

    }

    function __set($property_name, $value)

    {

     $this->properties[$property_name] = $value;

    }

    public function __call($method, $p)

    {

     print(“Invoking $method()<br>n”);

     //print(“Arguments: “);

     //print_r($args);

     if($method == ‘display’)

     {

      if(is_object($p[0]))

       $this->displayObject($p[0]);

      else

       if(is_array($p[0]))

        $this->displayArray($p[0]);

       else

        $this->displayScalar($p[0]);

     }

    }

    public function displayObject($p)

    {

     echo (“你传入的是个对象,内容如下:<br>”);

     print_r($p);

     echo “<hr>”;

    }

    public function displayArray($p)

    {

     echo (“你传入的是个数组,内容如下:<br>”);

     print_r($p);

     echo “<hr>”;

    }

    public function displayScalar($p)

    {

     echo (“你传入的是个单独变量,内容如下:<br>” . $p);

     echo “<hr>”;

    }

   }

   $o = new Overloader();

   //调用 __set() 给一个不存在的属性变量赋值

   $o->dynaProp = “Dynamic Content”;

   //调用 __get()

   print($o->dynaProp . “<br>n”);

   //调用 __call()

   //$o->dynaMethod(“Leon”, “Zeev”);

   $o->display(array(1,2,3));

   $o->display(‘Cat’);

  ?>

        以上代码中,调用了 display() 方法,可以根据参数的类型和个数调用类中的对应的代码段,从而实现了对象方法的重载。

PHP 5.0多态性方案浅析,php 多态性的设计,PHP技巧

2010/09/22

【摘 要】 本文想讨论面向对象编程中最为重要的部分之一–多态性的设计。为了说明问题,我使用了PHP 5。在你继续阅读之前,请首先明确本文并不是完全有关于PHP的。本文将讨论多态性的概念及其在面向对象设计中的应用,还将分析如何在PHP 5中使用多态性以及存在的优缺点。 提要:本文将讨论多态性的概念及其在面向对象设计中的应用,还将分析如何在PHP 5中使用多态性以及存在的优缺点。

PHP的最新发行版本中已经实现了对迟绑定的支持。当然,在使用其迟绑定功能时还存在很多问题。如果你使用的是更旧版本的PHP(我的服务器上运行的是 PHP 5.0.1版本),那么你可能发现其中缺乏对于迟绑定的支持。因此,请注意本文中的代码有可能无法工作在你特定的PHP 5版本中。

  一、 PHP 5和多态性

本文想讨论面向对象编程中最为重要的部分之一–多态性的设计。为了说明问题,我使用了PHP 5。在你继续阅读之前,请首先明确本文并不是完全有关于PHP的。尽管这种语言在以前的两个主要版本中在快速开发方面已经取得很大的进步,但是,在其与更为成熟的语言如C++或者Java相匹敌之前,它对于对象的支持还要经历一段历程。

  如果你是一位面向对象编程的入门者,那么本文可能不适合你,因为多态性这部分知识比较特别:一旦理解了它,你将永远不会忘记。如果你想简单了解一点对象编程和设计知识,并且当某人说”某个对象是多态的”时,还不十分清楚这是什么意思的话,那么本文正适合你。
到本文最后,你应该知道什么是多态性以及如何把它应用到面向对象的设计中,并且你会了解PHP 5中对象编程的优点与不足。

  二、什么是多态性?

多态性,其来自于dictionary.com的定义是”以不同形式,阶段或者类型出现在独立的组织中或者同种组织中,而不存在根本区别。”由该定义,我们可以认为,多态性是一种通过多种状态或阶段来描述相同对象的编程方式。其实,它的真正意义在于:实际开发中,我们只需要关注一个接口或基类的编程,而不必担心一个对象所属于的具体类(class)。

  如果你熟悉设计模式,即使只是有个初步了解,那么你也会了解这个概念。事实上,多态性可能是基于模式设计编程中的最伟大的工具。它允许我们以一种逻辑的方式来组织相类似的对象从而实现在具体编码时不必担心对象的具体类型;而且,我们只需要对一个所期望的接口或基类编程即可。一个应用程序越抽象,则它就显得越灵活–而多态性是对行为加以抽象的最好的方式之一。

  例如,让我们考虑一个叫Person的类。我们可以用称为David,Charles和Alejandro的类来子类化Person。Person有一个抽象方法AcceptFeedback(),所有的子类都要实现这个方法。这意味着,任何使用基类Person的子类的代码都能调用方法 AcceptFeedback()。你不必检查该对象是一个David还是一个Alejandro,仅知道它是一个Person就够了。结果是,你的代码只需关注”最小公分母”-Person类即可。

  在这个示例中的Person类也可以被创建为一个接口。当然,与上面相比存在一些区别,主要在于:一个接口并没有给出任何行为,而仅确定了一组规则。一个Person接口要求的是”你必须支持AddFeedback()方法”,而一个 Person类可以提供一些AddFeedback()方法的缺省代码-你对之的理解可以是”如果你不选择支持AddFeedback(),那么你应该提供一种缺省实现。”至于如何选择接口或基类则并非本文的主题;但是,一般说来,你需要通过基类来实现一个缺省的方法。如果你能够简单地勾勒出你的类所要实现的一组期望的功能,那么你也可以使用一个接口。

  三、应用多态性设计

  我们将继续使用Person基类的例子,现在让我们分析一个非多态性的实现。下列示例中使用了不同类型的Person对象–这是一种非常不理想的编程方式。注意,实际的Person类被省略。目前为止,我们仅关心代码调用的问题。

<?php
 $name = $_SESSION[‘name’];
 $myPerson = Person::GetPerson($name);
 switch (get_class($myPerson)){
  case ‘David’ :
   $myPerson->AddFeedback(‘Great Article!’,’Some Reader’, date(‘Y-m-d’));
   break;
  case ‘Charles’:
   $myPerson->feedback[] = array(‘Some Reader’, ‘Great Editing!’);
   break;
  case ‘Alejandro’ :
   $myPerson->Feedback->Append(‘Awesome Javascript!’);
   break;
  default :
   $myPerson->AddFeedback(‘Yay!’);
 }
?>

  这个示例展示了行为不同的对象,还有一个switch语句用于区分不同的Person类对象,从而执行其各自相应的正确操作。注意,这里针对不同条件的回馈注释是不同的。在实际应用程序开发中可能不会出现这种情形;我仅为了简单地说明类实现中存在的区别。

  下面的一个示例使用了多态性。

<?php
 $name = $_SESSION[‘name’];
 $myPerson = Person::GetPerson($name);
 $myPerson->AddFeedback(‘Great Article!’, ‘SomeReader’, date(‘Y-m-d’));
?>

注意,这里没有switch语句,而最重要的是,缺乏有关Person::GetPerson()会返回什么类型的对象。而另一个Person:: AddFeedback()是一个多态方法。行为完全是由具体类进行封装的。请记住,在此无论我们使用的是David,Charles还是 Alejandro,调用代码从不必了解具体类的功能,而仅知道基类就可以了。

  尽管我的示例并不完美,但是,从调用代码的角度,它已经展示了多态性的基本用法。现在我们需要分析这些类的内部实现。从一个基类进行派生的一个最伟大的地方在于,该派生类能够存取父类的行为,这种情况常常是缺省的实现,但是也可能出现在类继承链中用于创建更为复杂的行为。下面是这种情况的一个简单展示。

<?php
class Person{
 function AddFeedback($comment, $sender, $date){
  //把回馈添加到数据库
 }
}
class David extends Person{
 function AddFeedback($comment, $sender){
  parent::AddFeedback($comment, $sender,
  date(‘Y-m-d’));
 }
}
?>

  在此,David类中的AddFeedback方法实现中首先调用了Person::AddFeedback方法。你可能注意到,它模仿了C++,Java或C#中的方法重载。请记住,这仅是一个简单化的示例,并且你编写的实际代码完全依赖于你的实际工程。

  四、PHP 5中的迟绑定

  依我的看法,迟绑定正是使得Java和C#如此引人注目的重要原因。它们允许基类方法用”this”或$this来调用方法(即使它们不存在于基类中或调用一个基类中的方法,它有可能为继承类中的另一个版本所代替)。你可以认为如下的实现在PHP中是允许的:

<?php
class Person{
 function AddFeedback($messageArray) {
  $this->ParseFeedback($messageArray);
  //写向数据库
 }
}
class David extends Person{
 function ParseFeedback($messageArray){
  // 进行一些分析
 }
}
?>

  记住,在Person类中并没有ParseFeedback。现在,假定你拥有这一部分实现代码(为了本例说明问题起见),那么这会导致$myPerson成为一个David对象:

<?php
$myPerson = Person::GetPerson($name);
$myPerson->AddFeedback($messageArray);
?>

  出现分析错误!大致错误信息为,方法ParseFeedback并不存在或者一些类似的信息。关于PHP 5中的迟绑定我们就讨论这些!下面我们再归纳一下迟绑定的概念。

迟绑定意味着,方法调用在最后时刻才绑定到目标对象。这意味着,当该方法被运行时刻调用时,那些对象已经有了一种具体类型。在我们上面的示例中,你调用了David::AddFeedback(),而既然David::AddFeedback()中的$this引用一个David对象,那么你可以逻辑地假定ParseFeedback()方法是存在的–但事实上它并不存在,因为AddFeedback()是在Person中定义的,并且从Person 类中调用ParseFeedback()。
不幸的是,没有简单的方法来消除PHP 5中的这种行为。这意味着,当你想创建一个灵活的多态类层次时你可能有点无能为力。

  我必须指出,我选择PHP 5作为本文的表达语言仅仅是因为:这种语言并没有实现对象概念的完美抽象!因为PHP 5还处于其测试版本运行期,所以这是可以谅解的。另外,既然该语言中加入了抽象类和接口,迟绑定也应该被实现。

  五、小结

至此,你应该基本了解什么是多态性以及为什么PHP 5在实现多态性方面并不完美。一般说来,你应该知道如何用一个多态性对象模型来封装有条件的行为。当然,这样会提高你的对象的灵活性,并且意味着更少的代码实现。另外,通过封装满足一定条件的行为(具体要依赖于对象的状态),你还提高了代码的清晰程度。

PHP中的面向对象和面向过程

2010/09/21

      “真正的天才具有正确评价不确定的,有风险的和矛盾的信息的能力。–邱吉尔”

  使用许多编程语言时,你通常只能使用面向对象或面向过程二者之一的编程方式。而在PHP中,你可以自由选择或混用。目前绝大多数PHP程序员使用面向过程的方式,因为解析WEB页面本身就非常“过程化”(从一个标签到另一个标签)。在HTML中嵌入过程处理代码是很直接自然的作法,所以PHP程序员通常使用这种方式。

  如果你是刚接触PHP,用面向过程的风格来书写代码很可能是你唯一的选择。但是如果你经常上PHP论坛和新闻组的话,你应该会看到有关“对象”的文章。你也可能看到过如何书写面向对象的PHP代码的教程。或者你也可能下载过一些现成的类库,并尝试着去实例化其中的对象和使用类方法–尽管你可能没有真正理解这些类为什么可以工作,旧电脑回收或者为什么需要使用面向对象的方法来实现功能。

  应该使用“面向对象”的风格还是“面向过程”的风格?双方各有支持者。像“对象是低效的”或“对象非常棒”这样的议论也时有耳闻。本文不尝试轻易判定两种方法的哪种具有绝对的优势,而是要找出每种方法的优缺点。

  以下是面向过程风格的代码示例:  <!–p

print “Hello, world.”;

?>  print “Hello, world.”;

  >  

  以下是面向对象风格的代码示例:  <!–p

class helloWorld {

function myPrint() {

print “Hello, world.”;

}

}

$myHelloWorld = new helloWorld();

$myHelloWorld->  class helloWorld {

  function myPrint() {

  print “Hello, world.”;

  }

  }

  $myHelloWorld = new helloWorld();

  $myHelloWorld->myPrint();

  >  

  如果你想了解一些“面向对象”的基本知识,请使用Google搜索,网络上有非常多精彩的文章。

  谁像这样写代码?

  为了理解为什么这个论题成为论坛上口水战的导火线,我们看一些每个阵营的比较极端的例子。我们看看“过程狂热”和“对象狂热”。看看他们的观点听起来是不是有点熟悉。

  过程狂热

  过程狂热曾在上课时被计算机教师批评,因为这种方法没有使用更加抽象的实现方式。而支持面向过程者的观点“它可以工作!”并不能提高其编程水平和档次。毕业后他们可能找到一个工作,写驱动程序,文件系统或其它的偏向底层的编程,他们的注意力集中于速度和代码的精炼。

  “过程狂热”极端的例子是抵制对象,抵制抽象化。他们总在想着如何让程序运行起来更快,而不在乎别人是否能读懂他们的代码。他们常常把编程当成竞赛而不是团队活动。除了PHP外,他们最喜爱的编程语言是C和汇编。在PHP世界中他们可能会开发PECL模块,贡献出高效率的代码。 

        对象狂热

        对象狂热者热衷于在任何时候使用面向对象的风格来书写代码。他们没有真正考虑过用这种方式是否会影响程序的执行效率。有时候让人觉得他们更享受抽象的设计概念而不是现实的代码。他们通常很可能是项目管理者或文档书写者。

  对象狂热者指出,如果没有抽象的设计方法我们仍然在使用0和1进行编程。他们喜欢用伪码来描述问题。极端的例子是对象狂热者即使知道有时候会牺牲效率仍然使用对象。 除了PHP,他们最喜欢的语言是Java和Smalltalk。在PHP世界中,他们可能会开发PEAR模块,贡献文档化非常好,易于维护的代码。

  不要偏激和讽刺

  你知道为什么论坛上总是充斥着各种偏见吗?你的经验阅历,你对新事物的态度都可能是原因。作为程序员,我们需要时常注意这些偏见并以开放的心态去学习新事物。

  你的编码倾向?

  考虑一下当你书写PHP代码时有什么偏好或倾向。通常这些偏好是比较隐晦的。有时候你可能在每个项目中有着同样的偏好。我个人倾向于“优雅”,但我不想在此定义如何才是“优雅”的代码,那应当出现在另一篇文章里。但是,理论化的偏好不一定适合于实际项目?相反地,他们常常是一种偏见。

  理论化的倾向

  用最少行数的代码提供一个完整的解决方案

  在问题层次上考虑问题

  这听起来似乎很不错。但“代码行数最少”如何来衡量呢?要把代码注释算在内吗? 我们是否要把每一行都串起来而只用分号来区分呢?大括号呢? 很明显这种想法是错误的。

  再解释一下什么是“问题层次”。这是否意味着在我们的方案中的每个概念都需要建立一个类?或者需要在每个独立的文件里保持问题的每个部分,并建立一个复杂的文件树来与现实中的问题相对应?就是这样的想法–为每个想法准备一个文件或类!

  很明显这些概括极端化后变得可笑。但现实中存在更微妙的证明。是否常常会有程序员在团队合作时插入一行复杂的,强大的但没有注释的代码?这对于接手维护这些代码的人来说无疑是非常令人沮丧的事。 相反地,是否你的官僚的自以为是的上一级程序员常常“横冲直撞”般地,建立接口和类? 而那些接口和类不仅仅限制了负责实现的程序员,也限制了效率和灵活性,导致客户要求扩展程序时手足无措。 这些都是以上各种倾向的微妙的证明。

  实际倾向

  一个项目开始的时候,首先要寻求实际的编码目的和方向。旧电脑回收这个项目的实现目标是什么?下面是可能是答案。

  开发快,发布快

  尽可能快地运行

  易于维护,改进和扩展

  发布一个API

  第一、二个方向倾向于使用过程化的风格,而最后两个倾向于使用面向对象的风格。

  什么时候某种方式更有效?

  现在让我们试着评价每种方式在现实中的优势。

  面向过程案例

  有关PHP的面向过程化编程优势的一个基础性的论据是:PHP是一个解释性的语言–这意味着,不像其它的语言一样,它不会被编译成一个可执行的包,而是被解释并马上执行。它是一种脚本语言并存储于文本文件中(例外的,如果使用了Zend编译工具)。

  另一个反对在PHP4及更低版本中使用面向对象方式进行编码的理由是:在PHP的早期版本中对象的功能并没有经过良好设计。就像Rasmus曾说过的:“那是事后才想起要增加的功能”。这意味着在PHP4及更早的版本中,对象的效率是个问题。但PHP5出来后,这种情形会有改观。

  以下两个最流行的PHP程序–OsCommerce 和PhpMyAdmin.主要使用面向过程的编码方式。它们构建起来很快,运行起来也很快。两者都很自然地采用嵌入HTML的方法。

  OsCommerce

  OsCommerce实际上使用了很多对象,但绝大部分功能是通过“过程”来实现的。我曾经hack过OsCommerce,为其增添一些对于客户非常实用的自定义功能。这个过程是挺麻烦的,因为OsCommerce中的很多过程代码,没有使用模板化的系统,并且设计成多语言版,所以需要花一定的时间才能上手。但是它可以工作,事实上它已经很好地运行在数目众多的电子商务站点上了。OsCommerce同时提供了一个论坛和一个开发框架用来开发模块和插件。因此,现在已经有了很多其它开发者提供的实用的功能模块。

  PhpMyAdmin

  PhpMyAdmin直接使用的类只有一个:Mimer SQL Validator类,依赖于PEAR包中的Mail_Mime, Net_DIME 和 SOAP。这可能是考虑到开发的方便:利用现成的可以实现目的的代码。除此之外,一切都是面向过程的,HTML和PHP代码也是混杂在一起。

  PhpMyAdmin是我几乎每天都要用到的一个工具,用来对少量的数据表进行不太复杂的处理。有时我甚至鼓励我的客户将它当作后端的管理工具来使用(当然我会限制他们的权限)。PhpMyAdmin的表现非常棒,也很快。有时我想在一些项目中扩展PhpMyAdmin作为后端的管理工具,利用它的一些新功能如数据查询语句书签可以很方便地展示给我的客户和编辑。随着每个新版本的推出,PhpMyAdmin越来越实用,功能越来越强大。

  面向过程小结

  以上两个使用面向过程风格的程序都有非常好的文档和代码注释。OsCommerce提供的开发框架可以增加维护性和扩展性。但是两者都没有提供API,不能扩展程序到另外的体系中。

  如果你想把OsCommerce整合到一个帐单程序中,需要花费大量的时间和精力,就像扩展PhpMyAdmin成一个供客户使用的后端管理工具。不过从它们设计的目的来看,确实在各自的领域中都表现地很出色。

  面向对象案例

  支持面向对象风格者的观点都集中于扩展性和封装。仅仅用面向对象的方式来写代码不会为你的代码产生文档,但它可以鼓励你为之添加文档。并且,为了易于扩展,你可能会写一个API。 PHP5许诺让面向对象编程更加愉快。我开玩笑地将它称为PHP中的”Java 2”版本,因为它整合了Java中的许多特性,像接口,面向对象模型,try-catch语句等。但即使在对面向对象支持不力的PHP4中,仍然出现了许多出色的面向对象应用程序。

  Smarty

  Smarty用来构建带有复杂表单并基于模板的站点。最近,我写了一个可以完全换“皮肤”的在线考试系统?可以不用改变任何底层的代码和功能就可以将整个站点的外观界面和风格完全改变。为了让设计师可以易于设计新的界面,我设计了一个自定义的标签库作为Smarty标签库的扩展。可以像这样简单地插入:

  [navigation horizontal separated by ” | “]

  在一个页面的顶端有分隔开的导航。 因为Smarty已经提供了非常强大的机制来表现变量中包含的数据,这是一个映射较复杂的Smarty标签到skin标签的简单过程。关于这个的更多信息请看:http://simplequiz.peakepro.com/

  由于Smarty封装成一个类,并且它的方法都有很详尽的文档,使得使用模板的过程变得令人难以置信地易于扩展。同时,通过强制性地只能显式地传递你要使用的变量给Smarty模板的方法,Smarty也为PHP的环境变量提供了一个保护层。这种方法有助于在Smarty模板设计师和程序员间建立安全、可靠的工作关系。

  FPDF

  FPDF是一个非常优秀的工具。如果你被改来改去的pdflib的API所困惑,或者不愿为商业化的解决方案而交钱;或者由于共享主机的限制,无法使用扩展模块?请考虑使用这个免费的,纯PHP构建的PDF生成工具。

  这个类有很好的文档,包括许多很好的例子来阐述如何在PDF中布局文本和图片。在上面提到的同一个在线学习站点我使用FPDF来动态生成PDF文件,使用true type字体和300dpi精度的图像。在PHP中实例化FPDF类并进行PDF操作并不会花费太多额外的时间,因为PDF本身就可能需要花费几分钟来下载。事实上,动态生成并传送一个PDF所花的时间不比当使用一个慢速的网络连接来传送静态PDF文件所花的时间多。这都是相对而言的。并且,由于FPDF是基于类的,他可以被扩展。事实上,有些类方法虽然存在但还没有完全实现,仅作为一个框架,这可以为你在子类中建立你自己的内容(如自定义的头尾元素)提供向导。

  面向对象小结

  Smarty和FPDF都提供了带有良好文档的API来扩展主类。这说明了在类的内部组织方法和数据的必要性–有时同样的功能可以用函数和全局变量来完成,但这样不易于扩展。并且,使用对象对跟踪和保持PDF或HTML文档的风格非常有帮助,你可以将同样的数据用不同的格式来发布。Smarty和FPDF都是使用对象来建立灵活实用的类库的极好的例子。

  为什么两种方式都是必需的?

  回到我们充满热情的程序员身上,我们开始赞美他们:

  我们欣赏Smarty和FPDF的实用性和扩展性

  我们欣赏osCommerce和phpMyAdmin的运行速度和良好表现

  这种欣赏还包括对PHP的一些基础开发。PECL和PEAR都收到了很多赞扬和批评。我想这两个项目为阐明面向过程和面向对象编程的区别提供了很好的例子。

  PECl提供了PHP的扩展库,用C和面向过程的方式开发,注重速度和简洁精炼。通常,这些都是从已经存在的LGPL软件中移植而来,其中许多有趣的特性已经加入PHP。毕竟,PHP是用C写的。

  PEAR则贡献了很多有趣的类如建立Excel表或改变DNS记录等。使用PEAR类库可以为你节约大量时间,甚至可以让你在不怎么熟悉PHP的情况进行开发?“我不理解但它能用!”。

  总结

  希望本文能加深你对两种编程方式的理解,并且更重要地?鼓励你在更具体的细节上进行探索。我希望你会有自己的想法,并在实际开发中检验你的项目开发倾向,总结出更多实际的案例,并不啬写些针对本文的评论。

  总之,每种方式都有其优势的一面,纠缠于争论不如离开去写些实际的代码!