php及xdebug使用小结

php下搭配使用xdebug是十分好的组合,用于php的调试工作,下面分别介绍之:
1 WINDOWS下的安装
下载站点http://www.xdebug.org/
要确定使用一个跟你的PHP配合的版本才行,比如xdebug中的5。2系列版本是跟5.2
的php搭配的,5.3系列的跟5.3的PHP搭配的。目前的版本是2。1,然后你会发现
有相应的线程安全和非安全两个版本。如何知道下载哪个版本呢,可以将你跑
PHPINFO时的显示出来网页的源代码,COPY到
http://www.xdebug.org/find-binary.php中,然后提交,然后XDEBUG为告诉你
应该下载哪个版本了

将下载的文件放到d:\php\ext目录,重命名为php_xdebug.dll。
然后修改PHP。INI如下:
[Xdebug]
zend_extension=”D:\php\ext\php_xdebug.dll”
xdebug.profiler_output_dir=”D:\php53\xdebug”
xdebug.profiler_enable=On
xdebug.profiler_enable_trigger=1
xdebug.default_enable=On
xdebug.show_exception_trace=On
xdebug.show_local_vars=1
xdebug.max_nesting_level=50
xdebug.var_display_max_depth=6
xdebug.dump_once=On
xdebug.dump_globals=On
xdebug.dump_undefined=On
xdebug.dump.REQUEST=*
xdebug.dump.SERVER=REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT
xdebug.trace_output_dir=”D:\php53\xdebug”

注意要建立一个xdebug目录放调试输出的文件。
重新启动apache,在phpinfo中就可以看到有关XDEBUG的部分了

2 LINUX下的安装
tar -xzf xdebug-2.0.0RC3.gz
cd xdebug-2.0.0RC3
/usr/local/php/bin/phpize
./configure –enable-xdebug
cp modules/xdebug.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/

注:/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/不同的PHP版本路径不同,也不一定要放在该路径,可以在zend_extension_ts中自行指定xdebug.so所在位置。

3 使用,可以写个简单程序去看效果,比如:

php 模仿蜘蛛抓取内容并分析

header(“Content-Type:text/html;charset=gbk”);
message=_POST[‘message’];
contents = @file_get_contents(“message”);
if(contents==”Forbidden”){ch = curl_init();
timeout = 5;
curl_setopt (
ch, CURLOPT_URL, “message”);
curl_setopt (
ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt (ch, CURLOPT_USERAGENT, “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)”);
curl_setopt (
ch, CURLOPT_CONNECTTIMEOUT, timeout);contents = curl_exec(ch);
curl_close(
ch);
}
preg_match_all(“/<title(.*?)</title>/is”,contents,title);
preg_match_all(“/<meta(.*?)>/is”,contents,meta);
preg_match_all(“/<body(.*?)body>/is”,contents,body);
echo ‘title:’.strip_tags(title[0][0]).'<br><br>’;
for(
i=0;i<count(meta[0]);i++){
if(preg_match(“/keywords/i”,
meta[0][i])){
preg_match_all(“/content=”(.*?)”/is”,
meta[0][i],keywords);

}
if(preg_match(“/description/i”,meta[0][i])){
preg_match_all(“/content=”(.*?)”/is”,meta[0][i],description);

}
}
echo ‘keywords:’.strip_tags(keywords[1][0]).'<br><br>’;
echo ‘description:’.strip_tags(description[1][0]).'<br><br>’;
echo ‘body:’.strip_tags(
body[0][0]);
?>

ThinkPHP 3.2.3 bug 列表(2015-1-15)

下载TP 3.2.3,将本地的TP3.2.2升级。发现一些仍未修复和新的bug(欢迎交流,如需转载,请著名来自 default.fu@foxmail.com):

1)文件 ThinkPHP/Library/Behavior/TokenBuildBehavior.class.php 第47行:

原代码:tokenValue = tokenType(microtime(TRUE)) ;

应改为:tokenValue = is_callable(tokenType) ? $tokenType(microtime(TRUE)) : md5(microtime(TRUE));

否则会:执行报错!

2)文件:ThinkPHP/Library/Think/Upload/Driver/Bcs/requestcore.class.php 开头:

应该将开头的如下3行 namespace  注释掉,否则会报错重复定义!

  1. use Think\Upload\Driver\Bcs\BCS_RequestCore;  
  2. use Think\Upload\Driver\Bcs\BCS_ResponseCore;  
  3. use THink\Upload\Driver\Bcs\BCS_RequestCore_Exception;  



3)文件:ThinkPHP/Library/Behavior/WriteHtmlCacheBehavior.class.php 应该将 只允HTTP头为 2xx 的时候才保存本地缓存

1筛选条件文件名不为空

2且HTTP头为2xx

应该改为如下:

  1. namespace Behavior;  
  2. use Think\Storage;  
  3. /** 
  4.  * 系统行为扩展:静态缓存写入 
  5.  */  
  6. class WriteHtmlCacheBehavior  
  7. {  
  8.   
  9.     // 行为扩展的执行入口必须是run  
  10.     public function run(&$content)  
  11.     {  
  12.         //2014-11-28 修改 如果有HTTP 4xx 3xx 5xx 头部,禁止存储  
  13.         //2014-12-1 修改 对注入的网址 防止生成,例如 /game/lst/SortType/hot/-e8-90-8c-e5-85-94-e7-88-b1-e6-b6-88-e9-99-a4/-e8-bf-9b-e5-87-bb-e7-9a-84-e9-83-a8-e8-90-bd/-e9-a3-8e-e4-ba-91-e5-a4-a9-e4-b8-8b/index.shtml  
  14.         if (C(‘HTML_CACHE_ON’) && defined(‘HTML_FILE_NAME’)  
  15.             && !preg_match(‘/Status.*[345]{1}\d{2}/i’, implode(‘ ‘, headers_list()))  
  16.             && !preg_match(‘/(-[a-z0-9]{2}){3,}/i’,HTML_FILE_NAME)  
  17.         ) {  
  18.             //静态文件写入  
  19.             Storage::put(HTML_FILE_NAME, $content‘html’);  
  20.         }  
  21.     }  
  22. }  

4)文件:ThinkPHP/Library/Think/Storage/Driver/File.class.php 第45行:

原代码:mkdir($dir,0755,true);

应改为:mkdir($dir,0777,true);

否则会:在部分主机比如WIN VPS下会出现写入权限问题,写入失败。

原创by default.fu@foxmail.com

 

如何让HTML页面不缓存

在开发过程中,经常出现因为HTML被浏览器缓存,导致我们的测试很麻烦的事情,所以开发有必要在需要的加上这些标签。
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache, must-revalidate">
<meta http-equiv="expires" content="Wed, 26 Feb 1997 08:21:57 GMT">

本文链接:http://blog.clmao.com/?p=1388

运营人员、产品人员必知的30个硬道理!你承认不承认,事实就是这样!

1、无情之人,做不好社区

2、工作想要做的最好,有三种境界;第一种,叫把工作当成工作;第二种,叫把工作当成事业;第三,叫把工作当成“儿子”。

3、最好的运营,是综合能力更强、视野面够宽、内心更强大的运营。运营要耐得住寂寞。
最好的产品,是一个能衔接好各个环节的纽带。

4、运营就是一个挺苦逼的工作,谁坚持下来谁就最强。没受过委屈、吃过苦吃过亏、没背过黑锅、挨过用户的骂、被同事领导公司质疑、没为工作哭过、写过长邮件、发过牢骚抱怨还得坚忍着把工作做好、遇到瓶颈绞尽脑汁、请教别人没人搭理……根本不算做过运营。

5、能成为你的leader的人,一定有他的过人之处。如果遇到一个业务能力很强、人品不错、又肯教你本事的领导,那就知足吧!其实,什么都懂的领导,真没那么多。

6、从没接触过用户的产品经理,根本不配做产品!你做的其实是一个只满足你个人需求的产品吧?

7、牛逼的公司的确能给你一个光环,但不代表你就牛逼。

8、工作前10年是积累经验最好的时期,这10年决定你的未来。这十年里,一定至少要在一个公司好好至少沉淀3-4年。因为经验是需要连续的。

9、用人单位最看重的是什么?他们更看重你在以前公司积累的内在的东西,不是你平时做什么,而是你做出了什么成绩、你有什么资源、你在这个公司的成长轨迹、因为有你给这个公司带来了什么。不信你去问问猎头。

10、有很多人,都是在不断跳槽中迷失了自己。

11、抱怨是徒劳的,反正再抱怨,活儿也得继续干。关于这个问题,我给6个字:要么忍,要么滚。

12、在团队里到处传播负面情绪的人,一定要开掉!哪怕他能力再强也要开,因为他抱怨的越多,小宇宙就会变的越弱小。

13、自学能力,对于所有互联网从业人员,更加重要。尤其是运营人员,因为运营到涉及的东西实在太多了,而且没有正式的教程。

14、运营,其实没有什么捷径。实战才是王道,看再多的书,听再多的课,不如自己多练一次,基本功很重要。

15、我不相信任何方法论,因为运营更需要灵活性,循规蹈矩、按部就班必死。

16、以前做运营的时候看那些产品,觉得他们有一堆问题、缺点,当我自己做产品时,发现做产品真的挺难的。这个时候,我再回头看运营,又是另一个视角。
人生就是这样,别总说别人的不是,只要换个角度,你会发现,谁都不容易。

17、一个好的运营,会更加懂感恩。你会在不知不觉中被用户感染、感动,会发现他们其实都挺可爱的。

18、不要把自己的责任归咎给用户,工作做不好,就是你自己的问题。

19、做运营,一定要经常逼自己做做总结,别只顾闷头做事。有太多人,肚子里的墨水就是倒不出来,你说难受不?

20、谁都可以成为一个产品的“灵魂”,灵魂不一定是CEO。

21、工作最可贵的是什么?工作过程中磨练出来的责任心、态度、对细节的关注、坚韧和坚持、逆境商、做事的魄力、价值观,才是一个人成功与否的制胜法典,这些才决定你的未来。

22、有时候,选择比能力更加重要。会选择是一门学问,事实就是这样。

23、用户运营的核心出发点,只有4个字:尊重用户。
不要让用户感知到你在压迫TA,你高高在上,你没资格!

24、工作的时候也要居安思危,想想你离开这个公司还能剩下多少东西?如果啥也没有,那就继续干活吧。

25、你永远遇不到最完美的公司。在任何公司,你都可以学到很多东西。要做个有心人。

26、你有生之年,不可能做完运营工作所涉及到的所有环节,但你可以尽量涉猎。涉猎的前提,是把当前你正在做的东西,先夯实好。

27、我说我愿意用10年时间来磨练自己,可以受任何委屈、任何苦楚、任何不理解,摈弃钱的诱惑,积累冰山以下的东西,换我未来10年、20年的生活。有人说类,你太傻了,爱咋说咋说去吧,我相信傻人早晚会有傻福。

28、有一点我很庆幸,从小员工升到总监,我一级都没落过。每一级,我都收获很大。人的成长是需要过程的,没恋爱就结婚,一定有问题。拔苗助长不是对每个人都有好处,得看人。

29、把兴趣和工作结合在一起,会让自己变的更强大。
当年我误打误撞进了互联网,并慢慢喜欢上了它。这说明兴趣是可以被改变和慢慢培养的。

30、工作越久,职位越高,懂的越多,越觉得自己很“无知”、啥都不懂。一个人的能力总是有限的。学无止境,我还在学习!

ThinkPHP使用技巧

1、让Runtime下的文件格式化:入口文件处:define(‘STRIP_RUNTIME_SPACE’,false);

2、开发时不进行缓存:入口文件处:define(‘NO_CACHE_RUNTIME’,true);
3、ThinkPHP支持四种访问模式:a:普通模式 b:pathinfo模式 c:rewrite模式 d:兼容模式 在配置文件中用URL_MODEL=0(1、2、3)来表示。
4、改变分隔线/:URL_PATHINFO_DEPR。默认为:/
5、跨模块<控制器>调用模板方法:模块<控制器名:模板名(不加后缀)>,如$this->display(‘Index:tt’);
6、跨皮肤调用模板方法:假如Tpl下有skin皮肤,该皮肤下有User文件夹,该文件夹下有sg.html,那么$this->display(‘skin@User:sg’);就跨皮肤调用了。
7、全路径输出:在工程目录<非项目目录>下,建一个Public文件夹,这就是公共文件,可以将js文件放在这里供前后台共用。现在假设Public文件夹下有一个ss.html文件,那么
      $this->display(‘./Public/ss.html’);就输出公共文件中的ss.html模板。
8、display的参数:依次为:模板名,编码格式,mimie。如:$this->display(‘./Public/ss.html’,’utf-8′,’text/xml’);
9、系统常量:
__ROOT__  //代表网站的根目录地址
__APP__  //代表项目的入口文件地址
__URL__  //代表当前操作地址
__ACTION__  //代表当前操作地址
__SELF__  //代表当前的URL地址
__CURRENT__  //代表当前模块的模板目录
__PUBLIC__  //代表整个项目的公用目录
__TMPL__  //代表整个项目的模板目录,如Tpl/default/
ACTION_NAME  //当前操作名称
APP_PATH  //代表当前项目目录
APP_NAME  //代表当前项目名称
APP_TMPL_PATH  //代表当前项目的模板目录
APP_PUBLIC_PATH  //代表项目公共文件目录
CACHE_PATH  //项目模板缓存目录
10、配置文件中一些有用的参数:
‘SHOW_RUN_TIME’=>true,//运行时间显示
‘SHOW_ADV_TIME’=>true,//显示详细的运行时间
‘SHOW_DB_TIMES’=>true,//显示数据库的操作次数
‘SHOW_CACHE_TIMES’=>true,//显示缓存操作次数
‘SHOW_USE_MEM’=>true,//显示内存开销
11、halt();//中断程序执行。
12、dump是ThinkPHP里面预定义好的一个函数,具有显示更清晰的作用。
13、读取配置文件其中信息:C,如:$a=C(‘DB_HOST’);这种情况可用于在后台中向管理员显示服务器IP,数据库信息等。
14、自定义Model类并在实例化模型<模型就是数据库操作类>时使用,如:
a、在工程目录下的home<前台文件夹>下的Lib下的Model下建立一个IndexModel.class.php,然后里面写一个方法play,此方法循环输出1至10。
b、在Action中的方法里:
$index=M(‘index’,’IndexModel’); //这里可以加上自定义的模型类一起实例化
$index->play();
那么会输出1至10。
15、实例化模型可以用D也可以用M,M是快速实例化,且可带参,如M(‘User’,’play’);//play是一个对应的模型类。也可以$user=new UserModel();
16、D方法可以自动检测模型类,不存在时它会抛出一个异常。同时对于已实例化过的模型,不会去重复实例化。默认的D方法只能支持调用当前项目(应用)下面的模型。
17、ThinkPHP的分组功能:如果现在想在前台实合例化后台模型,那么:
$admin=D(‘admin.user’);
dump($admin->find());
将输出后台模型数据,这就是分组功能。
18、CommonAction中的_initialize方法让每一个继承它的类的每个方法都要经过_initialize。think_access表要加个pid(int11)字段。四张表是必须的,但是还需要一张user表,里面字段自定。
19、解决ThinkPHP中使用Smarty然后include方法无效的办法:不是不支持,但是路径没有那么智能,比如Tpl的default下的Task模块下有一test.html文件,那么,请用<{include file=’default/Task/test.html’}>以下为引用的话:
include所包含的文件由file属性来指定,路径相对于template_dir,也就是所如果你在使用smarty的时候设置模板路径template_dir假设为Tpl,那么file的文件就应该相对于Tpl文件来取,就你的例子
{include file=”Public/header.html”}的话,那么header.html要放在Tpl下的Public文件夹下。
其实,在Smarty类中把include函数改一下让它输出路径,那么这问题将很好查找。
20、关联模型:尝试了很多次,它一直提示找不到relation方法,就在准备放弃那一秒,奇迹真的出现了:它可以了,配置还是那个配置,真的未改动,那个配置也没什么怀念的,还是记录一下吧:
UserModel.class.php如下:
<?php
class UserModel extends RelationModel{
     public $_link = array(
     ‘phone’=>array(
     ‘mapping_type’=>HAS_ONE,
     ‘foreign_key’=>’uid’,
                  ),
);
}
?>
IndexAction.class.php如下:
 public function index()
    {
$user=D(‘user’);
$users=$user->relation(true)->find(1);
dump($users);
    }
21、关闭ap.php缓存:配置文件中:  APP_DEBUG=>true,
22、ThinkPHP中判断为空的方法:<present name=”name”>name已经赋值<else /> name还没有赋值</present>
23、ThinkPHP原生模板中if语句中session判断的问题:
      正确使用如下:
      <if condition=”$_SESSION[‘level’] egt 2″>
     <a href=”>收藏此人才</a>
     </if>
     正解:
由于 if 标签的 condition 属性里面基本上使用的是 php 语法,尽可能使用判断标签和 Switch 标签会更加简洁,原则上来说,能够用 switch 和比较标签解决的尽量不用 if 标签完成。因为 switch 和比较标签可以使用变量调节器和系统变量。如果某些特殊的要求下面, IF 标签仍然无法满足要求的话,可以使用原生 php 代码或者 PHP 标签来直接书写代码
<eq name= “Think.session.disEdit” value= “1”>。。。。。</eq>  这个没试,但已明白
<if condition=”$_SESSION[‘disEdit’] eq 1″>   这个是可以的

24、分组模式配置:

  //分组模式配置
‘APP_GROUP_LIST’=>’Index,Job,Member,Shop’,
‘DEFAULT_GROUP’=>’Index’,
25、_initialize这个函数不太好记,卧槽,记这里吧。
26、Thinkphp开发时关闭缓存的方法:
 

因在开发中需要经常修改,从而要经常删除缓存,才能看到效果。

所以为了开发的方便,可以把缓存给去除。

1.找到\ThinkPHP\Common\convention.php和\ThinkPHP\Common\debug.php

2.打开这两个文件找到你想要的设置即可。

debug.php中

‘TMPL_CACHE_ON’=>false,      // 默认开启模板缓存

convention.php中’

TMPL_CACHE_ON’   => false,  // 默认开启模板编译缓存 false 的话每次都重新编译模板

‘ACTION_CACHE_ON’  => false,  // 默认关闭Action 缓存

‘HTML_CACHE_ON’   => false,   // 默认关闭静态缓存

27、中文字符长度截取:{$vo[‘title’]|mb_substr=###,0,16,’UTF-8′},这是支持中文的,很好用。

28、ThinkPHP2.1中,如果想开启debug后显示页面运行时间,那么要在页面中加入{__RUNTIME__}才可以的。
29、HTML压缩:
TMPL_STRIP_SPACE
这个不是压缩 只是去空白和注释
30、模板后缀设置:’TMPL_TEMPLATE_SUFFIX’ => ‘.tpl’

sublime Text 3实用功能和常用快捷键收集

下面是我通过网上视频教程或文本资料学习sublime Text3时收集的一些实用功能和常用快捷键,现在分享出来,如果还有其它的好用的功能可以在下面留言,以便互相学习。

PS:ST3在Mac OX与Windows不同平台下的快捷键差别很大。下面是针对windows平台的解说。

1. 可以直接打开图片

版本3有个很好的特性(对于前端来说):可以直接在ST3中打开图片。

2. Goto Anything功能 — 快速查找(ctrl + P)

  • 输入@+函数名可以快速找到函数。
  • 输入#+文本可以快速进行文件内文本匹配。

3. 多行游标功能(ctrl + D,非常实用)

如何将文件中的某个单词更改为另一个?
方法一:利用查找替换功能:ctrl + H
方法二(推荐):多行游标功能,选中一个后,按ctrl+D可以同时选中另一个,同时多了另一个光标

但多行游标能完成查找替换功能不能完成的工作
比如在某些符合条件的语句后面添加新行,同时加入一些新的文本,如何快速的达到这一目的?
– 可以选中某一个模式,然后ctrl+D选中另一个,如果有某些不想添加新行的模式则按ctrl+K,ctrl+D跳过这个进入下一个符合条件的模式行。
– 还可以按Alt + F3快捷键全选所有符合条件的单词,产生多个光标,而不用一个个ctrl+D选中。
– 如果要在每行都加入光标,可以先ctrl+A然后ctrl+shift+L即可。
– 如果想在某个字符的多行后面加上光标,可以将光标放在这个字符后面,按住shift键,然后右键可以向下拖动产生多个光标。

4. 命令模式(应尽可能使用,而不用浪费脑细胞记忆大量命令的快捷键)

比如用ctrl+N新建一个文件后,默认是plain text,没有语法高亮功能,如何设置语法模式?
– 可以通过右下角的语法选择区选择希望设置的语法模式。
– 还有另一种更好的办法,即使用ctrl+shift+P打开命令模式,然后输入set syntax [language]设置为某种语言的语法模式,比如set syntax java则设置为java语法高亮。
– st3支持模糊匹配,你也可以直接输入syntax javassjava
– 若当前已经是某种语言的语法模式,则可以直接输入其它语言进行切换(而不用输入set syntaxsyntax了),比如当然为java语法模式,那么直接输入js就可以马上切换为javascript语法模式。

还可以输入minimap隐藏或显示右边的minimap缩影

5. 快速跳转到某一行

按下Ctrl + G,输入行号,可以快速跳转到该行。

6. 快速添加新行

  • Ctrl + Enter可以在当前行下新建一行。
  • Ctrl + Shift + Enter可以在当前行上面添加一行。

7. 多行缩进

选中多行后按Ctrl + ]可以增加缩进,按Ctrl + [可以减少缩进。
PS:发现用TabShift + Tab也是可以的。

8. 完整拷贝,避免格式错乱

我们发现,在从别的文件中拷贝一段代码过来的时候,多半只是第一行缩进,后面都乱了,这时可以使用Ctrl + Shift + V进行粘贴,可以在粘贴的过程中保持缩进,这时格式都是正确的。

9. 重新打开关闭的标签

在Chrome里面,如果你不小心关闭了某个标签页并想恢复它,你可以按下Shift + Ctrl + T重新打开它。
在ST3中也一样,如果你不小心关闭了某个文件,可以按下Shift + Ctrl + T快速恢复。连续重复该按键,ST将会按照关闭的先后顺序重新打开标签页。

10. 按住shift + ctrl然后按可快速选中一行中的某一部分,连续按扩大选择范围。

比如你需要将某一部分进行注释(ctrl+/)或删除,使用这个功能就很方便。

11. 上下移动行

定位光标或选中某块区域,然后按shift+ctrl+↑↓可以上下移动该行。

12. shift + ctrl + d可快速复制光标所在的一整行,并复制到该行之前。

13. Ctrl+Shift+M:选中花括号里面的全部内容不包括{}。

14. Ctrl+Shift+K:删除整行。

15. 快速关闭HTML里的标签

写html文件时利用快捷键Alt + .可以快速关闭某个标签,如写<html>后按Alt+.可以快速得到</html>
但这样还是挺繁琐,可以使用前端插件Emmet插件,直接在新建的html文件里(首先得设置语法模式为html)直接输入!(代表html5格式的html文档)然后按下ctrl+E即可。

16.Ctrl+J:选中折叠成一行。

如何解决DISCUZ! X3.1 通知翻页BUG问题

最近无忧主机小编遇一个discuz论坛的小bug,在运营DiscuzX3.1论坛的时候你会发现,是不是通知里面的帖子、点评、活动、悬赏、商品、提到我的、系统提醒里的翻页都是翻着就去了帖子里的对应页了?如果是正常的翻页的话,点击下一页还是这个栏目的内容而不是跳到帖子的内容页。这个问题是点击下一页的判断事件没有做好,所以只要增加对应的类型判断就可以解决这个问题啦!下面操作需要改代码,请大家做好文件备份:
需要修改文件路径:include/space/space_notice.php
需要修改的文件:space_notice.php
操作步骤:
1.把网站空间上面的space_notice.php文件通过FTP工具下载到本地,用高级记事本编辑修改,主要是防范文件编码格式问题;
2.打开文件后,找到代码:
multi = multi(count, perpage,page, “home.php?mod=space&do=do&isread=1″);
修改为:
pageurls = “home.php?mod=space&do=do&view=view”;
if(!empty(type)){pageurls .= “&type=type”;
}
multi = multi(count,perpage, page,pageurls);

3.代码修改完了以后,保存文件,上传到空间的指定目录下面,Discuz后台更新缓存即可。这里就是是定义了$pageurls类型属性,下面的if就是对这个类型进行判断,最后再调用即可解决这个问题了。

来源网站:http://www.51php.com/discuz/17497.html