PHP使用empty检查函数返回结果时报Fatal error: Can't use function return value in write context的问题

post by 朦朧中的罪惡 / 2010-3-2 17:18 Tuesday PHP

PHP开发时,当你使用empty检查一个函数返回的结果时会报错:Fatal error: Can't use function return value in write context

例如:

<?php
echo empty(strlen('be-evil.org'));

到PHP手册里面查看,在empty函数描述的地方有以下文字:

Note: empty() only checks variables as anything else will result in a parse error. In other words, the following will not work: empty(trim($name)).

empty() 只检测变量,检测任何非变量的东西都将导致解析错误!

因此,我们不能拿empty来直接检测函数返回的值,上面例子的解决方案如下:

<?php

$length = strlen('be-evil.org');

echo empty($length);

 

标签: php

评论(1) 引用(0) 浏览(35)

PHP函数strtotime理解笔记

post by 朦朧中的罪惡 / 2010-2-28 20:39 Sunday PHP

官方手册里面对strtotime的描述:

strtotime() 函数将任何英文文本的日期时间描述解析为 Unix 时间戳。

那么意味着这个函数可以把2010-02-28 18:31:33转换为1267353093这种格式

但是使用它转换时间戳的时候要注意的是服务器的date.timezone的配置,在函数说明中有这么一段话

该函数将使用 TZ 环境变量(如果有的话)来计算时间戳。自 PHP 5.1.0 起有更容易的方法来定义时区用于所有的日期/时间函数。此过程在 date_default_timezone_get()  函数页面中有说明。

上面的话可以这么理解:

如果date.timezone配置为空或者为UTC(格林威治时间),那么它就会直接把传入的时间直接转换为该时间的UNIX时间戳(相当于该时间识别为格林威治时间)

如果date.timezone配置了时区,例如Asia/Shanghai,那么这个函数就会将传入的时间认为是配置的时区的当地时间,然后根据该时区与UTC(格林威治时间)的时差来算格林威治时间的时间戳。

例如:

php.ini配置date.timezone为Asia/Shanghai;

我们传入:2010-02-28 18:31:33

函数转出的时间戳的实际时间为:

2010-02-28 10:31:33

因为Asia/Shanghai位于 +8区,那么函数会自动减去了8个钟头的时间来得到格林威治时间

参考程序测试代码:

<?php
echo '2010-02-28 00:00:00';
echo '<br>';
// 格林威治时间 0
date_default_timezone_set('UTC');
echo gmdate('Y-m-d H:i:s', strtotime('2010-02-28 00:00:00'));
echo '<br>';
// 中国上海时间 + 8
date_default_timezone_set('Asia/Shanghai');
echo gmdate('Y-m-d H:i:s', strtotime('2010-02-28 00:00:00'));
echo '<br>';
// 美国洛杉矶时间 - 8
date_default_timezone_set('America/Los_Angeles');
echo gmdate('Y-m-d H:i:s', strtotime('2010-02-28 00:00:00'));
echo '<br>';

输出:

2010-02-28 00:00:00
2010-02-28 00:00:00
2010-02-27 16:00:00
2010-02-28 08:00:00

标签: php 原创

评论(0) 引用(0) 浏览(24)

php函数unserialize数据返回false问题分析

post by 朦朧中的罪惡 / 2010-2-1 15:22 Monday PHP

unserialize的这个问题是由一个emlog论坛用户在使用时报错而发现的

问题表现情况如下:

emlog缓存 的保存方式是将php的数据对象(数组)序列化(serialize)后以文件的形式存放,读取缓存的时候直接反序列化(unserialize)缓存字 符串即可读取数据,关于序列化和反序列化的原理请看我先前的文章《php函数 serialize()与unserialize()不完全研究》
 

我从用户那里取到的缓存的序列化数据为:

a:1: {s:8:"kl_album";a:4:{s:5:"title";s:12:"精彩瞬 间";s:3:"url";s:41:"http://www.kaisay.cn/?plugin=kl_album";s:8:"is_blank";s:7:"_parent";s:4:"hide";s:1:"n";}}

咋 一看了解序列化的人都会说,这个数据很正常啊,没什么问题呢。可是直接把这段字符串进行unserialize,返回的值却是个False;

代 码

var_dump(unserialize('a:1:{s:8:"kl_album";a:4: {s:5:"title";s:12:"精彩瞬间";s:3:"url";s:41:"http://www.kaisay.cn /?plugin=kl_album";s:8:"is_blank";s:7:"_parent";s:4:"hide";s:1:"n";}}'));
 

点击查看原图

运行结果

点击查看原图

阅读全文>>

标签: php 原创

评论(0) 引用(0) 浏览(213)

php仿银行电子口令卡生成程序

post by 朦朧中的罪惡 / 2009-9-4 19:08 Friday PHP

用php写了一个银行口令卡生成程序,可以生成类似银行口令卡的图片或者表格。

工商银行的电子口令卡

 

我自己的(每次刷新就会重新生成一个图片):

在线演示DEMO:

生成html表格

生成png图片

背景图片可自行替换,数字的范围,表格行数格数全部可调,参见附件源代码。

本程序无版权,可随意传播

附件下载:
card.zip 14.02KB

标签: php 原创

评论(1) 引用(0) 浏览(562)

PHP实现各种排序算法

post by 朦朧中的罪惡 / 2009-8-26 15:25 Wednesday PHP

php实现冒泡排序、交换法排序、选择法排序、插入法排序、快速排序的程序实现。

源码 函数 + 注释

阅读全文>>

附件下载:
sort.zip 1.09KB

标签: php 算法

评论(0) 引用(0) 浏览(437)

PHP浮点数比较不准的解决方法

post by 朦朧中的罪惡 / 2009-7-28 17:30 Tuesday PHP

首先看一段代码:

<?php
$a = 0.1;
$b = 0.7;
var_dump(($a + $b) == 0.8);

打印出来的值居然为 boolean false

这是为啥?PHP手册对于浮点数有以下警告信息:

Warning
浮点数精度
显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999...。

这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333. . .。

所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数

那么上面的算式我们应该改写为

<?php
$a = 0.1;
$b = 0.7;
var_dump(bcadd($a,$b,2) == 0.8);

这样就能解决浮点数的计算问题了
 


 

标签: php

评论(0) 引用(0) 浏览(622)

PHP函数ereg与preg的区别

post by 朦朧中的罪惡 / 2009-7-28 17:27 Tuesday PHP

1.ereg里面是不需要也不能使用分隔符和修饰符的.

2.'.'在正则里面一般是除了换行符以外的全部字符,但是在ereg里面的'.'是任意字符,即包括换行符!如果在preg里面希望'.'能够包括换行符,可以在修饰符中加上's'。

3.ereg默认使用贪婪模式,并且不能修改.

4.preg的速度要远远比ereg快.

标签: php

评论(0) 引用(0) 浏览(659)

phpCodeBeautifier批量php程序代码美化工具

post by 朦朧中的罪惡 / 2009-4-24 12:35 Friday PHP

phpCodeBeautifier是一个非常不错的php代码美化工具,但是美中不足的是要使用它必须在命令行下使用非常长的命令参数来美化程序,更有一点不能忍受的是它一次只能美化一个程序文件的代码。

针对这些问题,我写了一个php的shell 脚本来解决这些问题。

主要功能:

使用phpCodeBeautifier批量美化php代码,一个命令就能自动把文件夹下所有的php文件(包括子文件夹)的代码美化完毕。

点击查看原图

程序代码批量美化步骤

请注意在美化操作前请务必备份自己原程序....

1.将phpCB.exe和phpcb.php拷贝到你要美化的php程序的文件夹里
例如 d:\emlog
2.然后 开始 - 运行 输入 cmd
3.在命令行窗口输入 d:\php\php.exe d:\emlog\phpcb.php 后回车
注意 d:\php\php.exe 是本机php.exe的安装路径,请根据自己机器的PHP安装路径修改...
4.耐心等到输出 job done!提示后,代码就美化完成了。

5月4日 update  修复路径递归bug

2010年 1月15日更新,修复文件路径失效

程序下载地址在这里

标签: php 原创 享受编程

评论(0) 引用(0) 浏览(1011)

基于Zend Framework的分页类

post by 朦朧中的罪惡 / 2008-7-10 21:41 Thursday PHP

刚学Zend Framework 感叹其强大的同时却发现其在Web开发中常用到的如分页,上传,字符串处理等等却没有实现,今天小试牛刀,给Zend Framework扩展了一个分页类。

核心编写思路:

     本分页类未采用常见的将HTML代码生成封装在类中的做法,而是基于Zend框架的MVC的思想,只在类中封装了处理分页所必需的数据的逻辑,而具体的分页信息显示逻辑则交予视图完成,将业务逻辑与显示逻辑分离,这样在开发灵活性上可以提高很多。

本例基于Zend Framework  1.5.2 编写,未将类整合到Zend Framework中,将本文件放置于INCLUDE_PATH/Util/下即可。本类只能在控制器下的方法中使用,实例化时需要传入控制器的request对象。

类核心代码:Page.php

阅读全文>>

标签: php 原创 Zend Framework

评论(0) 引用(0) 浏览(1131)

Eclipse+php插件+Xdebug搭建PHP完美开发/调试环境指南

post by 朦朧中的罪惡 / 2008-6-18 13:06 Wednesday PHP

最近要开始使用Zend框架开发中型应用系统了,由于采用完全面向对象的框架思路开发程序,不光开发思想,先前的Editplus+Dreamweaver编辑器组合显然不能满足我的要求了。我的新环境初步定为Eclipse+PDT插件+Xdebug+Apache

先前一直对dotNET、Java的IDE的代码自动嗅探、代码提示、程序断点调试等等自动化功能羡慕不已,而自己写PHP只能靠着echo、var_dump()来调试程序,能不能让PHP也实现断点调试呢?先前在Eclipse的PHP插件中发现了Debug的选项,说明调试功能应该是可行的,但是不知道是怎么个配置法,跑上google查找资料发现没有一个完整的介绍配置文档,我只能将获得的信息拼接起来后来测试。

结果是:完美实现PHP断点调试!

阅读全文>>

标签: php 享受编程

评论(3) 引用(0) 浏览(4052)