EGP Framework v1.0.0 beta 发布了…

近来PHP的框架越来越多,把自己这两年积累的东西组合起来,才发现,原来每个有经验的PHP程序员都可能有自己的框架。

EGP Framework
想到给框架命名就让我烦,记得曾经好像说过,框架就是个屁,然后就给这个框架命名为:EGP,谐音:一个屁 -_!!

发布这个框架,并不求太多人会来支持我或者使用这个框架,纯粹是为了学习和爱好,才开发了这个框架。当然,非常欢迎大家来跟我交流技术,或者参与到这个框架的开发中来。

简单的说一下这个框架吧,这是一个基于 PHP5.2 以上版本的轻量级 MVC 框架,速度超快,不相信的话就自己测试吧。当然,这个框架也是非常容易扩展的,像其他的框架例如:Zend Framework/Solar/Zoop/Pear 之类的都可以拿来直接使用。

当前版本为v1.0.0Beta,大家可以在项目的主页下载到最新版本,或者浏览源代码。

跟其他的框架不同,EGP是不会使用模板和ORM的,原因很简单,就是我不喜欢,我想这也是自己写框架的优点吧。提到这里可能很多人想要批评我,对,你们就继续批评吧,我就继续写代码好了,因为这个框架只为喜欢它的人而存在。

不过这个框架没什么文档,现在才开始打算写一些文档,而且也还有许多的功能没有完成,以后有时间再慢慢补充吧。

顺便感谢一下同事 Hyper,帮我完成了不少的工作,当然,这个框架也已经应用在我们公司的项目中了,而且也开源了。

下载地址:EGP Framework v1.0.0.beta.zip
项目主页:http://egp.googlecode.com/

jQuery 表格 zebra crossing & hover & click 效果插件

继续编写了一个 jQuery 插件,可用于表格中的 zebra crossing & hover & click 效果,使用方法很简单:

$('table').tablegrid(); //如果不做任何设置则可以直接这样调用
$
('table').tablegrid({
    
oddColor  : '#E0E0E0', //奇数行背景色
    
evenColor : '#F0F0F0', //偶数行背景色
    
overColor : '#C0D0E0', //鼠标悬停时背景色
    
selColor  : '#FFCC99', //行选中时背景色
    
useClick  : true       //是否启用点击选中
});

点击这里下载:
http://www.tblog.com.cn/down/jquery/jquery.tablegrid.js
http://www.tblog.com.cn/down/jquery/jquery.tablegrid.min.js

(未完,点击阅读全文)

jQuery Checkbox 全/反选操作插件

编写了一个 jQuery Checkbox 全/反选操作插件,提供了自动切换/全选/反选/获取字符串值的功能,使用方法如下:

$('input[@name=checkAll]').checkbox().toggle('input[@name=checkbox]'); //自动切换全选/反选
$
('input[@name=checkAll]').checkbox().checked('input[@name=checkbox]'); //全选
$
('input[@name=checkAll]').checkbox().unchecked('input[@name=checkbox]'); //反选
$
('input[@name=checkbox]').checkbox().val(); //获取字符串值

点击这里下载:
http://www.tblog.com.cn/down/jquery/jquery.checkbox.js
http://www.tblog.com.cn/down/jquery/jquery.checkbox.min.js

(未完,点击阅读全文)

Web开发人员必须学习的5门课程

简介

web开发人员都应该学习的5门课程:

  1. 你并不总是最聪明的那一个人
  2. 经验肯定是有一定用处的
  3. 没有银弹(即没有什么技术可以解决所有问题)
  4. 一种新的好东西并不一直是好东西(这里的东西指技术或者应用)
  5. 不是每一场仗都值得打 (不要总是认为自己的想法是正确的)

越来越多的Web开发人员通常都会问一些同样的问题。比如:哪一种开发语言最重要?初级开发人员的薪金会是多少?公司提供的免费培训有用吗?如何评估一个新的项目?尽管这些问题都很重要,但是开发人员往往对其他人的回答不以为然。一般来说,他们自己都不知道如何去寻找答案。以下五个建议或许有用。

你永远不是最聪明的人

在互联网泡沫到来之前我和一个同事一起从事语音识别系统扫描编码的工作。不久我们就发现通过电脑或者PDA可以很方便的上网,并且是无键盘操作。每当我质疑他的一些想法时但都遭到了他的坚决反对。他觉得他永远不可能犯错误。他曾经参加过技术讨论会的!在接下来的几个月里他有很多的设计都没能成功实现。

如果有一天你发现你与我的那位同事处境相似,那么也许你应该认识到你不一定总是正确的。你并不是办公室里面最聪明的人,所以主动接受别人的建议或许更能显示出你的大智慧。

经验真的很重要

作家永远不想承认这个事实,我们开发人员也是这样。尽管如此,我发现那些有过成功项目经验的人会更容易在接下来类似的项目中获得成功。当需求明确准备开发的时候,程序员通常都非常有自信有能力解决所有的问题,而不管所使用的方法是不是最佳的甚至可靠的。

事实上,经验从来都是很非常有用的。我的建议是相信别人的经验并向他们学习,而不是让自己嫉妒心无限膨胀。当自己犯错误的时候,多问几个为什么,多向别人寻求反馈并且尊重他人的意见。 (未完,点击阅读全文)

Google Code Project中文翻译

闲来无事,翻译了一下 Google Code Project 中的一些关于 wiki, issue, downloads 的描述,以便于更多不是非常熟悉英文的人加入到项目开发中来,英文水平有限,所以可能有些地方并不是很准确

Predefined Wiki Page Labels:

Featured             = 列出在项目主页
Phase-Requirements   = 项目规划和需求分析
Phase-Design         = 项目设计和关键问题
Phase-Implementation = 开发者指南
Phase-QA             = 测试计划和质量规范
Phase-Deploy         = 如何安装和配置程序
Phase-Support        = 计划支持的用户和宣传
Deprecated           = 废弃的,大多数用户不应该参照这个

Open Issue Status Values:

New = 新添加并且未审核的问题
Accepted = 已通过审核的问题
Assigned = 已经指派相关人员处理
Started = 正在处理这个问题

Closed Issue Status Values:

Fixed = 开发者提出的需要变化,已经解决
Verified = 已经解决的问题
Invalid = 无效的问题报告
Duplicate = 重复出现的问题
WontFix = 决定不解决这个问题
(未完,点击阅读全文)

用mysql触发器自动更新memcache

不错的一篇文章,用于项目中可以带来更多的便利,按照方法已经调试成功,可以大大提高项目的速度。

FROM:http://www.ooso.net/index.php/archives/436

mysql 5.1支持触发器以及自定义函数接口(UDF)的特性,如果配合libmemcache以及Memcached Functions for MySQL,就能够实现memcache的自动更新。简单记录一下安装测试步骤。

安装步骤

  • 安装memcached,这个步骤很简单,随处可见
  • 安装mysql server 5.1RC,安装办法也很大众,不废话了
  • 编译libmemcached,解压后安装即可
    ./configure; make; make install
  • 编译Memcached Functions for MySQL,在http://download.tangent.org/找一个最新的版本下载就是,
    ./configure --with-mysql=/usr/local/mysql/bin/mysql_config --libdir=/usr/local/mysql/lib/mysql/
    make
    make install
    接下来有两个办法让Memcached Functions for MySQL在mysql中生效

  • 在mysql的shell中执行memcached_functions_mysql源码目录下的sql/install_functions.sql,这会把memcache function作为UDF加入mysql
  • 运行memcached_functions_mysql源码目录下的utils/install.pl,这是一个perl脚本,作用同上一条

(未完,点击阅读全文)

扩展ArrayObject

使用过Zend_Config的朋友或许对下面这种数组使用方式并不陌生了:

<?php
$config = array(
    
'db' => array (
        
'adapter' => 'mysql',
        
'config' => array (
            
'host' => 'localhost',
            
'port' => '3306',
            
'dbname' => 'mydbname',
            
'username' => 'dbuser',
            
'password' => 'dbpassword',
            
'charset' => 'utf8',
            
'prefix' => '',
        
),
    
),
);
$config = new Zend_Config($config);
echo $config->db->adapter;
foreach ($config->db->config as $k => $v) {
    
echo "$k | $v \n";
}
echo count($config);
//... 甚至其他更多的方法

下面的扩展,通过几个魔术方法,不仅可以实现Zend_Config可以做到的事情,还可以继承Array_Object所有的可用方法
(未完,点击阅读全文)

is_file比file_exists快N倍

for ($i=0; $i<10000; $i++) {
    
is_file(__ROOT__ . '/App.php');
    
file_exists(__ROOT__ . '/App.php');
}

XDebug测试结果为:

php::is_file
————————————-
total self: 0.5ms
total cum: 0.5ms
calls: 10,000

php::file_exists
————————————-
total self: 41ms
total cum: 41ms
calls: 10,000

查看手册,虽然这两个函数的结果都会被缓存,但是is_file却快了N倍

PHP CLI 模式 (命令行模式的PHP)

在看这篇文章之间你需要将以下代码存为 *.reg 文件导入你的注册表,不过要记得将 D:\\php5\\ 修改为你的 PHP 路径
这样通过在PHP文件上点击右键,你的 PHP 程序就能以 CLI [Command Line Interface] 模式运行了
你可以参看这里获得一些帮助:http://www.tblog.com.cn/manual/php/features.commandline.html
复制内容到剪贴板

[HKEY_CLASSES_ROOT\*\shell\使用PHP运行(&R)]
@=”使用PHP运行(&R)”
[HKEY_CLASSES_ROOT\*\shell\使用PHP运行(&R)\command]
@=”cmd /K D:\\php5\\php.exe \”%1\”"

如果你不想添加注册表项目,你也可以在 cmd / shell 下输入以下命令来运行:
复制内容到剪贴板

$ php textcmd.php

在附件里你可以看到这段程序的代码,相信如果你会 PHP 的话,你已经能够根据这个程序扩展他来玩玩了

核心部分:
我们是通过 fgets(STDIN) 来获取到键盘输入的,至于为什么以及更多更详细的东西,大家就看上面给出的手册地址应该就能明白了

(未完,点击阅读全文)

使用类似JSON序列化后的字串

为了更容易在PHP与JS中有效的传递字符,使用这样的一个函数对字符串做个序列化就OK了,输出类似于json_encode() 的字符串。

拿这个再改造一下,也可以得到我们自己所需要的 json_encode() 了

FROM:http://www.php.net/manual/zh/function.json-encode.php#74878

function json_encode_string($in_str) {
    
mb_internal_encoding("UTF-8");
    
$convmap = array(0x80, 0xFFFF, 0, 0xFFFF);
    
$str = "";
    
for ($i = mb_strlen($in_str)-1; $i>=0; $i--) {
        
$mb_char = mb_substr($in_str, $i, 1);
        
if (mb_ereg("&#(\\d+);", mb_encode_numericentity($mb_char, $convmap, "UTF-8"), $match)) {
            
$str = sprintf("\\u%04x", $match[1]) . $str;
        
} else {
            
$str = $mb_char . $str;
        
}
    
}
    
return $str;
}
Theme Brought to you by Directory Journal and Elegant Directory