努力思考 + 实践, 眼高手低是不行的. 注册 | 登陆
浏览模式: 标准 | 列表全部文章

顽皮的闭包

部分引用来源:http://www.cnblogs.com/rubylouvre/archive/2009/07/24/1530074.html

问题描述
有个函数fn, 定义在某作用域r中, 函数fn的定义语句中包含对作用域v的某个变量v的引用, 由于变量v的作用域在v中, 所以倘若函数a将变量v绑定到位于其他作用域的应用中时, 变量v无法以window.v 或者 obj.v 的形式在后期引用, 只好以指针或者变量地址方式保存在函数a中用以持久变量v.

[详见全文]

» 阅读全文

Tags: javascript, 闭包

PHP 输出缓存一二

PHP中的output_buffering可以堆砌, 即可以多次调用ob_start()以开启缓冲区,具体参照手册中ob_start()的介绍,相关摘录如下:

Output buffers are stackable, that is, you may call ob_start() while another ob_start() is active. Just make sure that you call ob_end_flush() the appropriate number of times. If multiple output callback functions are active, output is being filtered sequentially through each of them in nesting order.

php.ini中的output_buffering不为Off时, 会自动开启一个缓冲区(等同于调用一次ob_start()), 如果为数值, 即为缓冲区的缺省大小.

ob_get_contents()在未开启缓冲区的情况下调用不报错, 返回false.而ob_end_clean()以及相类似操作会报告Notice级别错误, 告知未开启缓冲区. 

使用位运算来实现PHP权限控制

原理: 将每个二进制位为一个权限标识位

  • 增加权限使用 | (无论存在与否, 将对应的权限位置1)
  • 删除权限使用 ^& ~ (无论存在与否, 将对应的权限位置0)
  • 判断权限使用 & (使用与判断对应的权限位是否为1, 是, 返回非0; 不是, 返回0)
http://xiaobin.net/archives/8/
http://www.lizhijin.com/view.php/PHP/140.html
http://topic.csdn.net/u/20090421/23/25ff3c5c-8bd1-4899-a05e-ecac2bad36e6.html (算法与前两则不同)

利用Curl、socket、file_get_contents POST数据

PHP代码
  1. <?php   
  2. /**  
  3. * Socket版本  
  4. * 使用方法:  
  5. * $post_string = "app=socket&version=beta";  
  6. * request_by_socket('facebook.cn','/restServer.php',$post_string);  
  7. */  
  8. function request_by_socket($remote_server,$remote_path,$post_string,$port = 80,$timeout = 30){   
  9.     $socket = fsockopen($remote_server,$port,$errno,$errstr,$timeout);   
  10.     if (!$socketdie("$errstr($errno)");   
  11.       
  12.     fwrite($socket,"POST $remote_path HTTP/1.0");   
  13.     fwrite($socket,"User-Agent: Socket Example");   
  14.     fwrite($socket,"HOST: $remote_server");   
  15.     fwrite($socket,"Content-type: application/x-www-form-urlencoded");   
  16.     fwrite($socket,"Content-length: ".strlen($post_string)+8."");   
  17.     fwrite($socket,"Accept:*/*");   
  18.     fwrite($socket,"");   
  19.     fwrite($socket,"mypost=$post_string");   
  20.     fwrite($socket,"");   
  21.       
  22.     $header = "";   
  23.     while ($str = trim(fgets($socket,4096))) {   
  24.         $header.=$str;   
  25.     }   
  26.       
  27.     $data = "";   
  28.     while (!feof($socket)) {   
  29.         $data .= fgets($socket,4096);   
  30.     }   
  31.       
  32.     return $data;   
  33. }   
  34.   
  35.   
  36. /**   
  37. * Curl版本   
  38. * 使用方法:   
  39. $post_string = "app=request&version=beta";   
  40. * request_by_curl('http://facebook.cn/restServer.php',$post_string);   
  41. */   
  42. function request_by_curl($remote_server,$post_string){   
  43.     $ch = curl_init();   
  44.     curl_setopt($ch,CURLOPT_URL,$remote_server);   
  45.     curl_setopt($ch,CURLOPT_POSTFIELDS,'mypost='.$post_string);   
  46.     curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);   
  47.     curl_setopt($ch,CURLOPT_USERAGENT,"Jimmy's CURL Example beta");   
  48.     $data = curl_exec($ch);   
  49.     curl_close($ch);   
  50.     return $data;   
  51. }   
  52. /**  
  53. * 其它版本  
  54. * 使用方法:  
  55. * $post_string = "app=request&version=beta";  
  56. * request_by_other('http://facebook.cn/restServer.php',$post_string);  
  57. */  
  58. function request_by_other($remote_server,$post_string){   
  59.     $context = array(   
  60.         'http'=>array(  
  61.             'method'=>'POST',  
  62.             'header'=>'Content-type: application/x-www-form-urlencoded'."".  
  63.                       'User-Agent : Jimmy's POST Example beta'."".   
  64.                       'Content-length: '.strlen($post_string)+8,   
  65.             'content'=>'mypost='.$post_string)   
  66.         );   
  67.     $stream_context = stream_context_create($context);   
  68.     $data = file_get_contents($remote_server,FALSE,$stream_context);   
  69.     return $data;   
  70. }   
  71.   
  72. ?>  

Tags: curl, socket

Apache访问权限控制

转载自仲子说 [ http://www.wangzhongyuan.com/ ]
原文链接:

今天下午做一个WISA2007的论文库,专门存放WISA2007收到的论文,但是这些论文又不能让任何人都访问到,因此需要做一个访问权限的控 制。原来打算使用 Order Deny,Allow 这套机制,结果发现不好使,而且即使允许了一些ip,安全性仍然不高。但是查了一些这方面的资料,觉得还比较有用,所以以下也稍微介绍一下:

今天又被这两个参数小小的耍了一把,痛下决心整理一下,免得再被耽误时间。

[详见全文]

» 阅读全文

Tags: apache

设计模式原则 详解(转)

  这篇文章,不需要你一次就看懂,如果你真的能一次都看懂,我想设计模式对于你来说已经没什么难度了..因为设计模式就是要体现这些原则的,你可以把设 计原则看做是一门语言,设计模式是由这些语言编码的程序..你既然已经明白,精通了语言,剩下的编码自然是很简单的事情,编码的越多则经验越多,经验越多 则对原则的理解就越深...这是一个学习领悟的过程..

  我希望这篇文章能帮助新人感受到设计模式的乐趣,避免重复编码....减少劳动量..如果你能在用心静静的体会文章的每个字,每段话的意思,这样可以 避免走很多弯路...我以前学习设计模式的时候,就是因为忽略了原则,凭着感觉,看着书来学习设计模式,结果就是知其然而不知其所以然....如果你是初 学设计模式,再了解了OOP的三大原则(封套,继承,多态)之后,请反复的结合原则,来学习设计模式..这样可以达到事半功倍的效果...

详见全文

» 阅读全文

Tags: 设计模式

设计模式原则笔记

单一职责原则 SRP (Single Reponsibility Principle)

就一个类而言,应该仅有一个引起它变化的原因。 软件设计真正要做的许多内容,就是发现原则并把那些原则相互分离。如果多余一个动机去改变一个类,那么这个类就具有多余的一个职责,这时候就应该考虑类的职责分离。

开放封闭原则 OCP (Open-Colosed Principle)

软件实体(类、模块、函数)应该是可以扩展的,但是不可修改。就是对扩展开放,对修改关闭。通过构建抽象来隔离变化(譬如策略模式)。

依赖倒转原则 DIP (Dependence Inversion Principle)

抽象不应该依赖于细节,细节应该依赖于抽象;高层不应该依赖于低层,低层应该依赖于高层。即针对接口编程,不要针对实现编程。抽象的东西是最稳定 的,我们依赖的就是它的稳定。 编写的过程中应该考虑如何针对抽象编程,而不是针对细节编程,即程序中所有的依赖关系都终止于抽象类或者接口,那就是面向对象设计,反正就是过程化设计 了。 (终止指的是具体实现类的形态已经依赖于抽象类)

里氏代换原则 LSP (Liskov Substitution Principle)

子类型必须能够替代其父类型。即,在软件里面,把父类都替换成他的子类,程序行为没有发生变化。 有了里氏代换原则,才能使继承复用成为可能,只有当子类可以替换掉父类时,软件的功能不受影响,父类才能真正被复用,而子类也能在父类的基础上增加新的行 为。 有了里氏代换原则,才能使开放-封闭成为可能,正是由于子类型的可替换性才使得父类型的模块在无需修改的情况下扩展。

接口隔离原则 ISP (Interface Segregation Principle)

不应该强迫客户依赖于他们不用的方法。接口属于客户,不属于它所在的类层次结构。 通俗的说法:不要强迫用户使用他们不使用的方法,否则这些客户就会面临由于不使用的这些方法的改变所带来的改变。

参考下图的设计,在这个设计里,取款、存款、转帐都使用一个通用界面接口,也就是说,每一个类都被强迫依赖了另两个类的接口方法,那么每个类有可能因为另外两个类的方法(跟自己无关)而被影响。拿取款来说,它根本不关心“存款操作”和“转帐操作”,可是它却要受到这两个方法的变化的影响。

大小: 24.6 K
尺寸: 365 x 500
浏览: 37 次
点击打开新窗口浏览全图

那么我们该如何解决这个问题呢?参考下图的设计,为每个类都单独设计专门的操作接口,使得它们只依赖于它们关系的方法,这样就不会互相影了!

大小: 37.24 K
尺寸: 314 x 500
浏览: 29 次
点击打开新窗口浏览全图

实现方法:1、使用委托分离接口;2、使用多重继承分离接口

迪米特原则 LoD(Law of Demeter)、LKP(Least Knowledge Principle)

如果两个类彼此间不直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类要调用另一个类的某个方法的话,可以通过第三方转发这个调用。 强调:在类的结构设计上,每一个类都应该尽量降低成员的访问权限;类之间的耦合越弱,越利于复用,一个处于弱耦合的类被修改,不会对有关系的类造成波及。

合成/聚合复用原则 CARP (Composite/Aggregate Reuse Principle)

在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分。新对象通过向这些对象的委派达到复用已有功能的目的。

参考资料:
http://www.blogjava.net/totobacoo/articles/138227.html
http://www.cnblogs.com/feipeng/archive/2007/03/02/661840.html

Tags: 设计模式, 笔记

使用NetBeans + Xdebug调试PHP程序[总结]

转载请注明出处: http://www.zvv.cn/blog/show-101-1.html

  前些天发现通过Notepad++的DBGP插件结合PHP的xdebug扩展可以实现PHP文件调试,同时,介绍说包含了单步调试、监视变量还有跨 文件调试。按照网络上的资料配置好调试环境后实际试用了发现功能较为简陋,单文件调试还可,如果是跨文件调试项目就不那么舒服了,试用过程中因为DBGP 插件也存在许多缺陷,烦恼不断,经常性地stack overflow,很是遗憾。后来想想Np++只是Editor,不要对它强求过多,插件的版本也比较低,存在许多BUG也是可以理解的,等它慢慢完善再 说吧,开源社区的力量可是很强大的,^^。
昨晚在坛里某位同志的博文里再次见到了NetBeans这个熟悉的字眼(之前选开发环境的时候因为NB 非常强大,功能设置很人性化,界面非常友好,又有非常强的自动完成功能,都差不多就要定它了,可是因为当时不懂有xdebug,所以没搞懂怎么调试,就继 续用着EP Ctrl+B“调试”程序了),就用加上“xdebug”google了一下发现NB调试功能就是通过其实现的,而且功能齐全,评价不错,哈哈,大大的惊 喜,因为太晚了怕影响舍友休息,就决定次日来搞掂它。
……

  今天和MM溜达回来后,折腾一番,现将配置过程整理如下:

详见全文

» 阅读全文

Tags: netbeans, xdebug

Records:11512345678910»