RaterStar改版以后,一直拖欠着网友们一个小功能,自定义title,最近终于有时间将这个老版中就有的功能移植到了新版,并且使用起来也更加灵活方便。
使用方法请参照Demo11

RaterStar改版以后,一直拖欠着网友们一个小功能,自定义title,最近终于有时间将这个老版中就有的功能移植到了新版,并且使用起来也更加灵活方便。
使用方法请参照Demo11
半年前,曾写过一篇通过SVN Hooks实现本地SVN仓库与线上FTP服务器同步的文章《让虚拟主机也用上SVN:适用于个人的开发部署方式》,其中使用到了一个PhpFtpClient的类库,直到今天才有时间稍做了下整理,写了几个Demo,欢迎网友们提出宝贵意见以便改进。
目前已支持的功能:
PhpFtpClient围观地址:http://www.raychou.com/labs/php-ftp-client/
什么是连贯接口?经常用jQuery的朋友一定对下面的代码非常熟悉:
$('div').find('element').hide();
像上面这样,在一个方法后直接调用另一个同级方法,我们习惯上称其连贯接口。
连贯接口有什么好处呢?拿我们常用的工厂模式来举例:
$sql= new Joy_Db_SqlBuilder(); $sql->select(); $sql->table('test'); $sql->where('id' , '=' , '1');
换成连贯接口来实现的代码会是怎样呢?
$sql= new Joy_Db_SqlBuilder(); $sql->select() ->table('test') ->where('id' , '=' , '1');
可以看到在上面的代码中,相对以往的工厂模式的写法,使用连贯接口能稍微节省一些代码量,并且,代码逻辑性也更强。
如何实现连贯接口呢?这里我引用JoyPHP中的一段代码
class Joy_Db_SqlBuilder { /** * select方法 * * @return Joy_Db_SqlBuilder */ public function select() { $this->_args = array('method'=>'select'); return $this; } /** * 定义所用的表名 * * @param string $name * @param string $alias * @return Joy_Db_SqlBuilder|string */ public function table() { // @todo something // 返回this,实现连贯接口 return $this; } }
从代码中可以看到,每个方法都返回了$this,而$this表示的正式Joy_Db_SqlBuilder的实例,因此才可以继续调用其方法。
连贯接口很简单,写起来也很美,但是却遇到一个棘手的问题,类似ZendStudio,Eclipse之类的IDE似乎并不支持连贯接口的自动提示?其实结局的方法也很简单,只要像上面的代码注释那样,遵循PHPDoc的代码注释规范,在@return后注明返回的对象类型,这些IDE也同样能实现自动提示。

![]()
RaterStar是一年多前,在做三宝殿项目时开发的一个基于jQuery的投票插件,之后也得到了很多网友的关注和建议,让这个插件在一年多的时间内得以不断完善。
在实验室上线后,一直就考虑要将ReterStar加入到其中,但因为当初在写这个插件时,对jQuery并不是很熟悉,部分代码写得并不是很好,所以打算将其重写后再发布。
目前RaterStar已从Demo转移到Labs。新版的RaterStar在实现原版功能的基础上,更增加了一些实用的方法和参数,目前已经实现的功能如下:
更多的功能将在以后逐步完善,也欢迎大家给建议。
原有的两种数据调用方式都是一次性全部载入所有数据,虽然在点击菜单时切换速度快,但不适合数据量很大的情况,因此新增了第三种数据调用方式。
var options = { ajax : './data_builder/ajax.php' } var loc = new LinkageSelect(options); loc.bind('#demo6 .level_1'); loc.bind('#demo6 .level_2'); loc.bind('#demo6 .level_3');
在ajax模式下,只有在用户选择后,才会触发事件去调用下一层数据,并有缓存,也就是说不会重复下载已经调用过的菜单项。
天气预报系统一直都有很多网友在使用和关注,我也一直没有放弃更新。但一直因为原来的代码部署方式过于麻烦而一直没有做大的改进。在部署了新的开发方式后,一方面正好可以测试这套方案的健壮性,另一方面也把以前网友们提出的建议实现。
这次更新最大的改进是支持自定义数据格式,用户可以根据自己的需要选择数据格式,输出的条数,以及是否只显示雨雪天气预报。

在经历了数次更新后,这个系统也日趋完善,预计不久后就会将其加入实验室,开放源码供大家下载。
注:如何利用Google日历和本系统的数据源实现免费的天气预报提醒,请移步《天气预报V2隆重上线测试》一文中的网友介绍或自行搜索。
注:本文仅针对没有条件在主机上安装SVN服务器的情况,例如使用虚拟主机的开发人员。如果满足以下几个情况,本文可能非常适合你:
前言:我为什么要做这样的一个东西?近一个月来,在Raychou.com上花了不少时间,新开了实验室和小技巧两个栏目,尤其是实验室,以后可能会经常要更新代码,而以往每次更新代码都是先在Eclipse里写好,然后打开FtpRush,切换到要更新的文件夹,将整个目录提交到服务器,繁琐又费时。更是因为这个原因,weather也有段时间没有更新了,我是懒人,但仅仅是懒于做繁琐而机械的工作,我需要改变这个现状,于是有了下面的内容。
相信很多开发人员和我一样,在工作之余还会管理个人网站,和网友们分享自己的经验和代码。应该大部分人都是租用的虚拟主机,这样平时在公司那一套使用SVN提交代码的方式就不管用了,每次更新程序,都要先整理一份修改记录,然后依次用FTP上传,麻烦耗时不说,还会经常遗漏文件,造成不必要的麻烦。
想要让线上代码和本地开发环境保持同步,方法也很多,最简单的可以利用CuteFtp,WinScp的文件夹监视功能,当被监视的文件夹内有修改动作,就会自动触发程序提交代码到服务器。但这样也有个弊端,在本地调试的修改也会带上线,虽然是方便了,但可能造成更大的问题。
之前我写过《利用SVN Hooks实现快速方便的代码管理/发布方式》一文,是利用SVN Hooks实现在提交代码到SVN时,自动部署更新的文件到测试服务器。同样的,利用Hooks,我们也可以把代码同步到FTP服务器,不同的是,这次的SVN服务器是架设在开发环境中,也就是说,不需要额外的服务器,任何人都可以通过SVN实现开发环境与线上的代码同步。

如图所示,当开发人员在本地开发并调试后,提交代码到本机SVN服务器,触发post-commit钩子,调用post-commit.bat,(由于对bat的语法不熟悉,在这个架构中,我用php代替bat,post-commit.bat仅做了在命令行下调用post-commit.php并传参),然后然后进行文件的同步处理。
大致流程如下:
post-commit.bat代码如下:
set PATH=D:\Program Files\WebServer\PHP5.2.6;%PATH% php "F:\wwwroot\site\raychou\labs\php-svn-hooks\post-commit.php" "%1" %2 "config/raychou.php" 1>&2
除post-commit默认的%1和%2两个参数外,这里我还传了第三个参数”config/raychou.php”,这个参数是传递给PHP脚本,让其去读取指定的配置文件,这个配置文件是在同步过程中需要用到的一些设置,例如SVN工作目录,FTP帐号等设置。
php在接收到hooks传递过来的参数后,读取配置文件,连接本地SVN版本库,取得并分析本地更新日志,连接FTP服务器,开始同步文件。
关于SVN Hooks以及post-commit的参数传递,请参考这里http://www.subversion.org.cn/svnbook/1.4/svnbook.html#svn.ref.reposhooks
代码下载,代码部署结构请参考http://www.raychou.com/labs/
在Web开发中联动下拉菜单的应用非常广泛,拿我们最常见的地区选择来说,相信几乎所有的网友都填过下面这样的表单:
![]()
当选择省份后,之后的下拉菜单中会自动给出前一个菜单中所选省份内的城市,以此类推,当选择城市后,再后面一个菜单会自动给出区或县城让用户选择,简单说就是每一次的选择都会影响下一个菜单的可选项,我们称之为联动菜单。
这样的JS代码在网上很多,我曾经也写过一个全国省市区三级联动下拉菜单,在项目中也得到了应用,但在实际项目中,需要使用类似这样联动菜单的地方很多,比如类别的选择等等,这样我就需要为每一个需求去写一份代码,而其中90%以上的代码都是重复或相似的,不但浪费了时间,用户在浏览网页时更需要下载大量重复的代码,增加不必要的开销。
因此我也一直有想法,将联动功能与联动数据分离开来,让一份JS代码能够适应不同的联动菜单需求,于是便有了LinkageSelect,基于jQuery的联动选择菜单。目前已经实现但不局限于以下功能:
在当前发布的版本中,还包括一个DataBuilder,支持手工创建用于LinkageSelect的JSON动态数据源。计划中就不再提供其他数据装换工具,有需要的朋友可以研究DataBuilder数据库格式,自行导入,再通过json.php输出所需数据源。
Demo/Download请猛击 -> http://www.raychou.com/demo/jquery-rater/
自PHP5后,官方大大丰富了对面向对象的支持,其中有个重要改变:引入了__autoload()函数,从此不再需要在php脚本的header写一堆的require或include了,用PHP函数手册中的话说:”它会在试图使用尚未被定义的类时自动调用”。
这一机制大大减轻了开发人员的负担,只要在架构初期考虑好了目录结构和命名规范,在开发过程中,需要再为代码中要用到的类分别去require相应的文件,减少了大量代码。
但这样一来,也容易出现运行一个程序,某个类文件被include多次,例如有以下四个脚本:
#file:include1.php include 'include2.php'; //@todo something
#file:include2.php //@todo something
#file:script1.php include 'include2.php'; //@todo something
#file:script2.php include 'include1.php'; include 'script1.php' //@todo something
当执行script1.php时, include ‘include2.php’; 这行代码被执行了一次。而执行script2.php时,这行代码被执行了两次。
这里只是一个简单的例子,在实际的项目中,include2.php被include的次数可能更多。这样反复的include,是否会影响性能呢?为此我写了个脚本来测试。
#file:SimpleClass.php class SimpleClass { public function __construct() { echo get_time() . "\r\n"; } }
#file:php_include.php for($i = 0;$i < $loop;$i++) { include_once "SimpleClass.php"; new SimpleClass(); }
当$loop值为1时,脚本耗时约0.00018906593322754秒,当$loop为1000时,脚本耗时约0.076701879501343秒。
如果我们用autoload实现呢?
#file:php_autoload.php function __autoload($class_name) { include_once $class_name . '.php'; } for($i = 0;$i < $loop;$i++) { new SimpleClass(); }
在这段代码中,我定义了__autoload函数,几乎一样的脚本,当$loop为1时,耗时0.0002131462097168秒,而当$loop为1000时,耗时仅为前面代码的1/7,0.012391805648804秒。
但请注意看SimpleClass的代码,其中输出了一行字符串,如果去掉这行输出后再比较,会是什么样的结果呢?
在$loop同为1000的情况下,前者耗时0.057836055755615秒,而使用了autoload后,仅仅0.00199294090271秒!效率相差近30倍!
从上面的测试可以看出,当文件仅仅被include一次,autoload会消耗稍微多一点的时间,但如果在文件被反复include的情况下,使用autoload则能大大提高系统性能。
至于是否要使用autoload来解放程序员,这就仁者见仁,智者见智了。在我看来,条件允许的前提下,牺牲这一点性能(某些情况下,可能是提升性能),换来更为便捷的开发,是值得的。
附:本文测试脚本下载