<?xml version="1.0" encoding="UTF-8"?><!-- generator="WordPress/2.8.4" -->
<rss version="0.92">
<channel>
	<title>4's symfony blog</title>
	<link>http://www.foolbirds.com</link>
	<description>all about symfony</description>
	<lastBuildDate>Fri, 14 Oct 2011 12:36:02 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	
	<item>
		<title>PHP中静态调用非静态方法</title>
		<description>1.PHP中可以静态调用非静态方法么？

今天我被问到PHP中可不可以使用 className::methodName() 的方法来调用一个没有声明Static的方法。在我的印象中，我好像是见过这种用法，但又有些不确定。大家都知道，在手册或者教程里，方法被分为静态方法和非静态方法，通常我们静态调用的方法，肯定是静态方法。

那如果我们调用了非静态方法会怎么样呢？首先做测试.
&#60;?php
class test{
function test(){
echo 'it works';
}
}
test::test();
执行以下，返回错误如下
Fatal error: Non-static method test::test() cannot be called statically in /home/×××/test.php 
on line 7 Call Stack: 0.0002 332548 1. {main}() /home/×××/test.php:0
这个时候，可能大家就会认为静态调用非静态方法是行不通的了，但其实，结论下的过早了，因为test()这个方法比较特殊，与类同名，是构造方法。

我们继续测试。
&#60;?php
class test{
function test(){
echo 'it works';
}
function test2(){
echo 'it works too';
}
}
test::test2();
执行结果：
it works too
这说明，静态调用非静态方法是可行的，但是静态调用构造方法是不可以的。为了验证这个结论，我又做了如下测试：
&#60;?php
class test{
static function test(){
echo 'it works';
}
}
test::test();
执行的结果如下：
Fatal error: Constructor test::test() cannot be static in /home/xxx/test.php ...</description>
		<link>http://www.foolbirds.com/php%e4%b8%ad%e9%9d%99%e6%80%81%e8%b0%83%e7%94%a8%e9%9d%9e%e9%9d%99%e6%80%81%e6%96%b9%e6%b3%95.html</link>
			</item>
	<item>
		<title>symfony系列文章归档</title>
		<description>由于种种原因，本站的symfony系列教程已经停止更新一年之久，又因种种原因，本站的编辑们也都停止了对本站的维护。

symfony是我使用过最经典的php框架，symfony可能不是最好的，但在我用过的种种框架中，symfony绝对是最优秀的，虽然，我现在已经连创建项目的命令都已经忘掉了，但是symfony的oo思想让我获益匪浅。

目前symfony的2.0版本已经在开发阶段，国内的symfony开发者也越来越多，本站绝大多数的symfony文章都是1.2版本的时候写的，可能已经跟不上时代，但其中的思想仍然值得广大symfony入门者参考，我对本站的symfony文章进行了一次整理，很遗憾没能把这些文章写成一个系列。

基础篇

	symfony环境检查 
	symfony目录结构及部署办法说明 
	symfony cheat sheet 
	symfony命令行详解 
	form表单的新建、修改 
	form使用一例 
	如何在视图里接收变量 
	在layout中应用action定义的变量 
	如何设置title、keywords 
	使用helper加快视图开发
	admin后台模板作用 
	Criteria详解
	symfony1.2中的文件上传和验证 
	关于上传图片后显示上传图片的路径问题 
	在symfony中使用多语言(i18n) 

进阶篇

	跳并快乐着－symfony跳转指南 
	插件使用一例:在form中加入拾色器 
	开启symfony的CSRF保护 
	CSRF使用注意事项和form的标准用法 
	在symfony项目中应用TinyMCE 
	在symfony项目中应用TinyMCE（续） 
	在symfony中使用FCKeditor上传图片附件 
	symfony中组件槽(Component Slot)的应用 
	使用symfony filter 过滤URL 

高级篇

	编写widget一例:支持Google Maps的坐标输入框 
	symfony缓存(cache)机制简介 
	在admin generator中加入复杂的自定义列 
	symfony1.2下的命令行程序(batch) 
	创建symfony插件 
	symfony插件编写一例:QRcodePlugin 
	发布你的symfony插件 
	symfony1.2使用1.0插件sfFeedPlugin一例 
	symfony数据表关联详解(for propel) 
	symfony1.2的后台(generate-admin)模板结构 
	在symfony中使用第三方图片处理工具WideImage 
	成为一名symfony文档贡献者 
	内嵌表单详解（How to Embed Forms in Symfony 1.2 Admin ...</description>
		<link>http://www.foolbirds.com/symfony-archives.html</link>
			</item>
	<item>
		<title>session 在 IE下失效 解决办法</title>
		<description>工作中,遇到一个问题 ,同样的代码在FIREFOX 和 IE 下 表现 相差太多   ,查之       ,竟然是因为  session_id() 返回值的问题,解决过程如下
1. 测试 FIREFOX 和 IE ,IE每次刷新页面时  得到的SESSION_ID 值不一样,FIREFOX 一样
2.测试 IE6,IE7,IE8 竟然 只有IE7 有这种 现象...........
3.经多方查证,没有结果 ,网上没有人和我的情况一下,自己解决吧           
4.我左三圈右三圈 ,最后发现  竟然 是 ...</description>
		<link>http://www.foolbirds.com/session-ie-firefox-ie7.html</link>
			</item>
	<item>
		<title>在IE下使用Script Debugger调试javascript兼容性问题</title>
		<description>该死的浏览器战争,苦了我们这群web开发者,每天都要面对html兼容性,css兼容性,javascript兼容性! 还有什么比这更要命的么?

通常情况下, 我都用Firefox下的Firebug插件来开发Javascript应用, 但是经常会有代码在IE下就失去作用, 而且IE的错误提示还很模糊, 经常会让我无从下手.

以前听说过IE下的一些调试工具,从没用过,刚刚被一个语法错误逼的没办法向bobhero求助,他推荐我装了Script Debugger.

这是微软开发的一款开发工具, Google之, 进入微软的网站下载安装, 如果你不是Win98或者Win Me记得要下载 Script Debugger for Windows NT 4.0 and Later, 否则等着杯具去吧.

安装过程大概就是, 下一步->下一步->下一步->下一步->下一步->下一步....

安装完毕后, 进入Internet选项->高级, 如下图把禁用脚本调试(Internet Explorer)和禁用脚本调试(其他)两个选项关闭掉. 如果你忘了这步, 那么, 痛苦去吧, 你会发现和没装没什么差别.


搞定上一步之后, 找你的错误去吧.




我刚刚发现我还装过另一个调试工具,我怎么就不记得了呢...

 </description>
		<link>http://www.foolbirds.com/%e5%9c%a8ie%e4%b8%8b%e4%bd%bf%e7%94%a8script-debugger%e8%b0%83%e8%af%95javascript%e5%85%bc%e5%ae%b9%e6%80%a7%e9%97%ae%e9%a2%98.html</link>
			</item>
	<item>
		<title>vim配置文件注解</title>
		<description>最近，本人把自己的vim的配置文件整理了一下，现今拿出来晒晒与大家分享，附注释如下：
﻿
set nocompatible "设定 gvim 运行在增强模式下,不使用vi的键盘模式
set helplang=cn  "设置帮助的语言
filetype on "设置文件类型的检测
filetype plugin on "为特定的文件类型允许插件文件的载入
set et "编辑时将所有 Tab 替换为空格
set sw=2 "自动缩进的时候， 缩进尺寸为 2 个空格
set sts=2 "设置 softtabstop 为 2. 输入 tab 后就跳了2格.
set smarttab "行首的  根据 'shiftwidth' 插入空白
let php_folding = 1 "折叠类、函数等
set backspace=indent,eol,start "不设定的话在插入状态无法用退格键和 Delete
set nobackup " 覆盖文件时不备份
set history=50		" 设置在命令行显示多少历史记录
set showcmd			" 在状态栏显示目前所执行的指令
set ...</description>
		<link>http://www.foolbirds.com/vim%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6%e6%b3%a8%e8%a7%a3.html</link>
			</item>
	<item>
		<title>使用symfony filter 过滤URL</title>
		<description>这是一个过滤URL中 多个'/'的例子
修改 apps/myapp/config/filters.yml
添加代码
myFilter:
  class: myFilter
(myFilter可自定义)
创建文件myFilter.class.php
创建位置apps/myapp/lib/
文件内容如下
使用preg_match 是因为 ereg 过时 
注意preg_match 匹配正则时以'/'开始和结束 
class myFilter extends sfFilter
{
 public function execute ($filterChain)
 {
   //提取uri
   $str = $_SERVER['REQUEST_URI'];
   //判断是否匹配正则
   if(preg_match("/(.*\/{2,}.*)((\.html)*)/",$str)){
     //要跳转的页面
     header("Location:/error.html");
     //跳转后代码不执行
  ...</description>
		<link>http://www.foolbirds.com/use_symfony_filter_to_filteredurl.html</link>
			</item>
	<item>
		<title>仿symfony机制实现不用require或者include来实例化类</title>
		<description>
class MyClass {
  public static function register() {
    //如果解串行器发现有未定义类要被实例化,则设置spl_autoload_call函数加载请求类. 
    ini_set('unserialize_callback_func', 'spl_autoload_call');     
    //自动载入类，类似于__autoload
    if (false === spl_autoload_register(array("MyClass","autoLoad"))) {
      throw new Exception('wrong');     
  ...</description>
		<link>http://www.foolbirds.com/%e4%bb%bfsymfony%e6%9c%ba%e5%88%b6%e5%ae%9e%e7%8e%b0%e4%b8%8d%e7%94%a8require%e6%88%96%e8%80%85include%e6%9d%a5%e5%ae%9e%e4%be%8b%e5%8c%96%e7%b1%bb.html</link>
			</item>
	<item>
		<title>在Emacs里使用 PHPCS</title>
		<description>前文书说的好 MAKER 可以在VIM 里使用PHPCS   ，VIM是很牛B 的编辑器，但是还有一个更牛B 的编辑器就是 EMACS。

具体有多牛，去GOOGLE 百度一下

PHPCS是什么 ，请参考前文 

这里贴上 EMACS 下使用的代码


(defun php-lint ()
  (interactive)
  (let ((compilation-error-regexp-alist '(php))
        (compilation-error-regexp-alist-alist ()))
    (pushnew '(php "\\(syntax error.*\\) in \\(.*\\) on line \\([0-9]+\\)$" 2 3 nil nil 1)
  ...</description>
		<link>http://www.foolbirds.com/emacs-phpcs.html</link>
			</item>
	<item>
		<title>vim配合phpcs实现自动语法检查</title>
		<description>在开发过程中, 我们需要保证语法正确, 当然这是基础, 也是必须做到的. 很多时候, 我们还要去遵守一些编码规范, 比如PEAR规则, Zend规则等等, 这样可以让我们写出清晰并且容易阅读的代码, 但是通常来说, 自觉遵守规范是一个很难办到的事情, 所以我们可能需要借助一些辅助方法.

Vim是一款很强大的编辑器, 拥有着可谓无所不能的扩展机制, 这里我简单介绍一下Vim配合phpcs实现自动和手动的语法检查.
什么是phpcs?

phpcs全名PHP_CodeSniffer, 是PEAR中一个用来检测PHP代码规范的包, 他是确保你代码简介一致的必不可少的工具, 并且可以更快的帮你找到语法错误. 关于phpcs的具体安装和使用方法这里就不做说明了, 请各位读者自行查找.

注: phpcs中默认提供了一些编码规范, 在开发过程中我们可能需要一些自己的规范, 可以在phpcs的目录中添加新规范, 规范的编写方法请参考一些内置规范, 规则都是phpcs已经有的, 只需修改声明就可以了.

我们需要扩展vim的功能, 这样需要编写一些脚本, 脚本可以直接加到你的vim配置文件中, 也可以保存成脚本保存在$VIMHOME/plugin/目录下.

下面是脚本内容:

function! Phpcs()
  " phpcs 命令的路径和参数, 请根据环境自行修改
  ! /home/bobhero/Dropbox/project/libphp/bin/phpcs --standard=Zend "%"
  cwindow
endfunction
" :w 自动验证语法
autocmd BufWritePost *.php call Phpcs()
" :Phpcs 验证语法
command! Phpcs ...</description>
		<link>http://www.foolbirds.com/vim%e9%85%8d%e5%90%88phpcs%e5%ae%9e%e7%8e%b0p%e8%87%aa%e5%8a%a8%e8%af%ad%e6%b3%95%e6%a3%80%e6%9f%a5.html</link>
			</item>
	<item>
		<title>symfony1.4 DateTime对于PHP低版本的兼容问题</title>
		<description>在symfony1.4中使用DateTime 类 但是该类出现于 PHP 5.2.0以后 所以在使用(部分方法需要在PHP5.3.0以后版本才能使用)PHP5.2.0以前版本的服务器上 调用symfony调用该函数会出错 为了解决该类问题根据 PHP5.2.0 的DateTime类 写了俩个类 用以在低版本中使用该类
以重写方法
DateTime.class.php
__construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] )
string format ( string $format )
int getOffset ( void )
int getTimestamp ( void )
DateTimeZone getTimezone ( void )
DateTime setDate ( int $year , int $month , int ...</description>
		<link>http://www.foolbirds.com/use-datetime-in-php5-1-x-with-symfony.html</link>
			</item>
	<item>
		<title>如何在fixtures.yml写循环添加数据</title>
		<description>举一个简单的例子：
city表的字段有id,enabled,name
那么往city表插入字段的写法如下:

city:
&#60;?php for ($i = 1; $i &#60;= 6; $i++): ?&#62;
city_&#60;?php echo $i ?&#62;:
enabled: 1
name:    city&#60;?php echo $i."\n" ?&#62;//用php写表的字段的数据结尾时一定写上"\n"
&#60;?php endfor; ?&#62;

注意：书写时一定要注意fixtures.yml的写法,注意空格.

 </description>
		<link>http://www.foolbirds.com/%e5%a6%82%e4%bd%95%e5%9c%a8fixtures-yml%e5%86%99%e5%be%aa%e7%8e%af%e6%b7%bb%e5%8a%a0%e6%95%b0%e6%8d%ae.html</link>
			</item>
	<item>
		<title>如何实现动态添加／删除表格元素</title>
		<description>此效果是用jquery实现的,现代码如下:

／／监听添加表格行数的阿按扭
$(document).ready(function(){
$("#but").click(function(){
var $table=$("#tab tr");
var len=$table.length;
$("#tab").append("&#60;tr id="+(len+1)+"&#62;&#60;td align=\'center\'&#62;&#60;img width=\'140\' src=\'images/1.jpg\'&#62;&#60;/td&#62;&#60;td align=\'center\'&#62;&#60;a href=\'javascript:void(0)\' onclick=\'deltr("+(len+1)+")\'&#62;删除&#60;/a&#62;&#60;/td&#62;&#60;/tr& gt;");  
})
})


／／删除指定的表格的行
function deltr(index)
{
$table=$("#tab tr");
$("tr[id=\'"+index+"\']").remove();
}

以下写在body中即可

//添加按钮
&#60;input id="but" type="button" value="添加" /&#62;


//空的表格
 &#60;table class="print_product_img" id="tab" border="1" width="60%" align="center"&#62;
&#60;/table&#62;
 </description>
		<link>http://www.foolbirds.com/%e5%a6%82%e4%bd%95%e5%ae%9e%e7%8e%b0%e5%8a%a8%e6%80%81%e6%b7%bb%e5%8a%a0%ef%bc%8f%e5%88%a0%e9%99%a4%e8%a1%a8%e6%a0%bc%e5%85%83%e7%b4%a0.html</link>
			</item>
	<item>
		<title>PHP中数据类型间的比较</title>
		<description>这是由bobhero发现的一个很有趣的问题. 废话不多说, 直接上代码.

var_dump(array() > 9999); // true

结论:任何数组大于整数

var_dump(array() > 'abc'); // true

结论:任何数组大于字符串

var_dump(array() < array('a')); // true

结论:任何非空数组大于空数组, 其实这个应该是所有人都知道的

var_dump('abc' > '123');// true

这个没有结论, 是字符串比较的问题

var_dump('abcasdfad' > 123);// false
var_dump('abcasdfad' > 1);// false
var_dump('abcasdfad' > 0);// false

结论:任何整数大于字符串

以上是实验过程和结论, 刚发现的时候我也是很惊奇的, 不过最终也没弄明白其中的原理,  希望高手指点. </description>
		<link>http://www.foolbirds.com/%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b%e9%97%b4%e7%9a%84%e6%af%94%e8%be%83.html</link>
			</item>
	<item>
		<title>使用symfony routing.yml 修改URL</title>
		<description>由于不规范的URL带有程序和数据库的结构信息会给程序带来隐患并且在程序中经常需要使用?name=value来传递变量的值所以修改URL非常重要.
在symfony中 使用 routing.yml 文件就可以修改URL
下面是一个URL修改的例子
将 project/news/show?title=123 修改成 project/news/123.html
在projiect/apps/myapp/config/routing.yml 添加下列代码
shownews:
  url:   /news/show
  param: { module: news, action: show }
上面代码是定义一个 @shownews 路由使其访问 news/show
注意:每次修改routing.yml 后需要执行 symfony cc 清理缓存
在页面中添加如下代码
&#60;?php echo link_to($name, '@shownews?title='. $title);?&#62;
$name是超链接名称
$title是要传递的值
(如果 $name='测试' $value='123')
上面的php代码转换成HTML代码如下
&#60;a href="/news/show?title=123"&#62;测试&#60;&#x2F;a&#62;
在projiect/apps/myapp/config/routing.yml 修改代码
shownews:
  url:   /news/:title.html
  param: { module: news, action: show }
  ...</description>
		<link>http://www.foolbirds.com/use_symfony_routing_change_url.html</link>
			</item>
	<item>
		<title>在symfony中如何删除 head mate name=title</title>
		<description>SYMFONY 自带的 生成标签的函数(setTitle()) 会默认生成一个 &#60;META NAME='TITLE'...&#62;这样的一个 标签，这个标签会在 SETTITLE 里受影响 即 同时设置两个TITLE 一个是 &#60;TITLE&#62;一个是&#60;META&#62; 根据客户需求有些时候需要删掉 META NAME='TITLE' 这种，办法如下
新建MyProject/app/MyApp/lib/myWebResponse.class.php 文件
插入如下代码
 </description>
		<link>http://www.foolbirds.com/symfony_delete_mate_name_title.html</link>
			</item>
</channel>
</rss>

