自信,思考,总结,分享,执行力!
分类目录归档:点滴笔录
WHAT SHOULD BE
As title。 一个26的phper. And you?
一些事
不经意间,这年已过了大半,掂量掂量拥有了什么 — 还是一声“喟叹”而已。
很忙,又很闲 — 每天写着机械性的code,还得唠叨地“指导”着,不用思考,不用学习,却掉了不少肉。 — 哈哈,减肥一直是我的梦,可惜的是憔悴的显老了。
其实,还是因为迷茫。
还是有点可记忆的事。遇上了两本好书《黑客与画家》和《浪潮之巅》。“Michael Buble – Home” 真得很好听。
世界宽广,生命长,我想走慢一点…
PHP的单例模式
单例模式被当作职责模式,被用来在应用程序中创建一个单一的功能访问点。比如,在OOP中,一个对象只负责一个特定的任务(一个对象去访问数据库等)。
作用:
1)节约系统资源。单例类仅有一个实例存在。
2)维持应用程序状态的同步
特点(至少以下四个特点):
1)必须拥有访问级别为private的构造函数。因为单例类不能在其它类中直接实例化,只能被其自身实例化。
2)拥有一个保存类的实例的静态成员变量。
3)拥有一个访问实例的公共的静态方法。
4)必须创建一个空的访问级别为private的__clone()方法。单例类不会创建实例的副本,而是内部存储的实例返回一个引用。
举例:数据库连接职责的集中控制
class Db { private $_db; // 构建对象时其值被填充 public static $_instance; // 静态变量,用于保存类仅有的一个实例 private function __construct() { $this->_db = pg_connnect('.....'); } // 私有的__clone方法消除了PHP语言中可以复制对象,防止破坏单一职责 private __clone() {} // 单例模式的实际构造 public static function getInstance() { // 检查静态实例变量是否已保存Db类的一个实例 if (! (self::$_instance instanceof self)) { self::$_instance = new self(); } return self::$_instance; } public functon query($sql) { // 执行查询的code } }
静态特性的“缺陷”
静态特性应用在变量,类和方法上,带来的好处是无可厚非的:
1)作为静态变量(用static关键字修饰的函数变量,创建时可提供默认的初始化值,其初始化值不能是表达式),在某一函数执行后,其值仍然不会丢失。这可在全局变量作为模拟静态时,消除了变量名称冲突的现象。
2)作为类的静态属性或方法,其变量值或方法对每个类的实例都是有效的,即是所有的实例共享这个成员或方法。这样可以避免创建类的实例,省略实例化的代码,更高效些(因为类的每个实例都会占用一小部分的系统资源)。
然后,静态类会对特定类型的测试产生影响。因为静态特性的使用会导致类之间通过名称绑定一起,使得单独的测试某个组件变得更加困难。因为类的名称是硬编码的,这样测试时,这个类不容易被模拟。
有 这么个设计原则,叫IoC(控制反转),它试图在OOP中去掉所以相互依赖的现象。相互依赖现象少了,越容易单独测试某个组件。也使对象具有更好的多态性和封装性。这是对于复杂的系统来说,是非常重要的。显然,使用静态特性,IoC就受到限制。
在PHP的应用中,静态特性还是很受欢迎的。现在,自己只能等着瞧它如何“走”~
简单思考
来个简单的滑动显示评价等级星标识。即是假如有个星标识,当鼠标移到到第三个星标识时,前三个星“满色”(充满颜色),后二个没有颜色。看了一些例子,有写得很棒的,很玄的。下边给个很简单的:
function stars(num) { var items = document.getElementById('rating_stars').getElementsByTagName('a'); if (items.length) { for (var i=0; i < items.length; i++) { items[i].className = i <= num ? '' : 'disabled'; } } }
对a标签的className定义下,就可以看到效果。 很简单也很不美观,但效率还是过得去吧,不过有时候觉得,想法简单点,可能会有好的局面和收获。
箴言
每一个令你真正动心的女孩,必有一点其他女孩不再会使你感觉到的极美之处,这一极美之处会在一个阶段里不由分说地主宰了你,令你全身心地感动。所以它应该是你终身的神祗,即便分手也不可以亵渎它。否则就是亵渎了你自己的感情。
如果你仅仅是对某个女孩感兴趣,却没有那种原子裂变似的反应,你不可去招惹人家。你可以等待,等待时间和机遇为你揭示这种兴趣的源头,爱与发现是紧紧相连的。
语言在真情的压迫下是没有表现能力的。甜言蜜语说得越顺嘴越有才气就越不可信任。但是人们往往迷恋语言带来的快感。你要慎用语言,有“涩”的感觉才是最高境界。
Ecshop模板类的一个bug
Ecshop类的模板类(includes/cls_template.php),简化的着实好用。但可否注意到这个bug:
简单举例说:
在模板里面的某一个smarty标签有:{foreach from=$goods_list item=goods} , 还有 {$goods.goods_name}等
在PHP文件注册变量有:$smarty->assign(‘goods_list’, $goods_list); $smarty->assign(‘goods’, $goods);
注意到smarty语法foreach语句中的item的名字是goods,而又有一个goods标签名被注册;其模板类有考虑防止注册相同标签的变量(即$this->_val[var_name]中的var_name防止重复),所以它在处理var_name的时候,在_compile_foreach_start(tag_args)处理,利用$this->_patchstack成员(array类型)暂存储foreach中的处理后的item名字(即对goods后面再加入随机数字,以防重复)。然后再注册变量的时候,判断下标为item的名字的$this->_patchstack变量是否存在,然后再以其值作为$this->_val数组的下标,而进行赋值。
然而,它在处理$this->_patchstack中,有一个必要的任务,存储一个变量的时候,用完它的时候,必须废了它。它在这个关节上,有bug(从make_val方法入手查起就了然)。所以导致在多个foreach在item的名字,如果和单独一个变量名相同时候(上边提到的goods),就会导致生成编译文件的时候,对单独变量名的:eg:编译后的本应该是$this->_val[‘goods’][‘goods_name’], 却是 $this->_var[‘goods_0_95615500_1302147485’][‘goods_name’],这样$smarty->assign(‘goods’, goods)注册的变量,就不可赋值到对应的变量中,从而显示不出数据。
罗嗦了那么多,就是该废它的时候,没废到。在select($tag)方法中,当tag{0} == ‘/’和substr($tag, 1) == ‘foreach’的时候,在$this->_foreachmark == ‘foreachelse’的时候,没有array_pop($this->_patchstack)。允许它,问题解决。
还有,模板类它一开始并为声明_patchstack其成员变量,这本身埋下不稳定的因素。
感悟
受挫一次,对生活的理解加深一层;
失误一次,对人生的醒悟增添一阶;
不幸一次,对世界的认识成熟一级;
磨难一次,对成功的内涵透彻一遍。
Blog跑得快了~
CPU: Intel Pentium DC 2.8GHz
RAM: 2 x 1GB DDR1
HDD: 2 x 160GB Raid-1
Bandwidth: 1Mbps Bandwidth
把WordPress Blog搬到以上环境,快上了好多,告别CPU赛扬2.4的环境下的痛苦。