上一部分可能讲得东西太基础一点吧。这部分主要是说说回调函数和闭包函数。

6. 不是函数的’函数’

一直在使用echo,也一直把echo当成是一个没有返回值的函数,echo等只是表现得很像函数,其实它是PHP的”语法结构”(或称语言结构),并非真正的函数。

var_dump(function_exist('echo'));

结果自然是false了,是不存在echo这个函数的。echo、print、list、array、include、require、empty、isset和unset等都不是函数,都是语法结构。好比if、while和for这些关键字一样,是用于实现一定的功能的结构,并不是函数。

它们运行的效率比函数是要快的,所以是首先要选用的。比如 !count($arr)在效率是不如empty($arr)的,count是内置函数。除了使用记事本编写代码的人之外,其他人还是很容易区别语言结构和函数的,因为绝大部分的IDE会把语言结构的关键字用特殊的颜色高亮(一般会跟if和while等关键字是一样的颜色的)。

继续阅读 »

相关文章

地球人都知道PHP是弱类型解释型语言,定义函数时要用到关键字(或称保留字)function,在PHP5.0中又引入了惹名函数(或称闭包函数),让函数这个东西显得更加的有趣了。实际上函数也不是太简单的东西。

PHP中有很多内置的函数,直接就是可以使用的,一部分是要和扩展模块一起编译,而PHP的扩展模块已经有不少了,想要一一的了解这些扩展模块还是比较花功夫的。想要使用一些功能,首先要想到的就是是否可以通过编译扩展模块而实现了。想要多了解点这些东西,除了用到时多查手册之外,似乎也没有更好的办法了吧。

其次,有时候为了降低可兼容的版本要求,或者找不到扩展模块,就要自定义的函数了。自定义函数是非常简单的事情,比如:

   1: function foo() {
   2:     echo 'foo';
   3: }
   4: foo();//output: foo

1. 函数内定义函数或类

手册中告诉我们,函数内部也是可以定义函数的,甚至可以定义类,如下方式定义的话,会是怎么回事呢?

   1: function foo() {
   2:     fucntion bar() {
   3:         echo 'bar';
   4:     }
   5: }
   6: bar();
   7: //Fatal error: Call to undefined function bar()

是的,bar()这个函数是不存在的。但是在调用bar()之前先调用一下foo(),那么bar()就存在了。如果是类的话,那么会是怎么样呢?

   1: function foo() {
   2:     class Bar {
   3:     }
   4: }
   5: $bar = new Bar();//Fatal error: Class 'Bar' not found

同理,Bar这个类在调用foo()之前,也是不存在的,调用了foo()之后,它就存在了。

继续阅读 »

相关文章

很高兴PHP5也迎来了JSON,并且在5.3版本中新增了一个函数json_last_error(),用于得到运用json_decode($string)之后的错误代码。

但是感觉PHP中的JSON还是有点问题,下面一个JSON格式的字符串,结果让我郁闷了很久……

$json_str = '{"key":"value"}';
var_dump(json_decode($json_str));//结果正常 
$json_str = '{"key":"\\value"}';
var_dump(json_decode($json_str));//结果是null
echo json_last_error();//结果是4,对应JSON_ERROR_SYNTAX(意思是Syntax error)
$json_str = '{"key":"\\\value"}';
var_dump(json_decode($json_str));//终于把\显示出来了
$json_str = '{"key":"\\\\value"}';
var_dump(json_decode($json_str));//居然结果和三个\是一样的
$json_str = '{"key":"\\\\\value"}';
var_dump(json_decode($json_str));//null
$json_str = '{"key":"\\\\\\value"}';
var_dump(json_decode($json_str));//null
$json_str = '{"key":"\\\\\\\value"}';
var_dump(json_decode($json_str));//足足输入了7个\,才可以正常显示两个\
$json_str = '{"key":"\\\\\\\\value"}';
var_dump(json_decode($json_str));//结果和7个\一样
$json_str = '{"key":"\\\\\\\\\value"}';
var_dump(json_decode($json_str));//又到了null了
$json_str = '{"key":"\\\\\\\\\\value"}';
var_dump(json_decode($json_str));//null
$json_str = '{"key":"\\\\\\\\\\\value"}';
var_dump(json_decode($json_str));//11个\,显示三个\
$json_str = '{"key":"\\\\\\\\\\\\value"}';
var_dump(json_decode($json_str));//12个\,显示三个\
//.......

不要觉得我无聊,要这么多slash干什么?前两天在工作就被这个问题恶心到了。当时调用了一个同事写的接口,他返回的JSON数据中就有两个slash。数据挺多的,一开始还不知道是slash的问题,把返回的字符串用JSON在线检验工具都是可以通过的,用其他的语言也可以解析成想要对象(或数组),可是偏偏PHP就不行。

如果说奇数个slash出错,可以理解,可是从结果来看,奇数个slash不一定会出错,偶数个slash也不一定是正解的。结果差不多是:

1、2个slash会解析错误。

3、4个slash实际显示1个。

5、6个slash会解析错误。

7、8个slash实际显示2个。

…………

总结下规律,每4个出现轮回。4^i(这里表示4的i次方)或4^i – 1个slash连写的结果是一样的,实际上显示i个slash(i>0,显示0个情况不用看规律也知道,不过要特别指出1、2个slash会解析错误),而连着有4^i+1或4^i+2个slash连写的话,JSON数据是json_decode()不出来的。

不了解PHP对JSON字符串的解析在底层上是怎么实现的,总感觉这个应该是个BUG!

那么实际应用中要先对字符串进行一轮addcslashes ($json_str, ‘\\’)之后再进行解析。

相关文章

  最近都没有时间写点东西,主要是有空的话,就看这本书了。

  学习C语言对于phper来说,也不算是不务正业了。众所周知,PHP的解释器用C语言编写的,而”学会”了C语言的话,就可以给PHP写扩展了,Linux下的话一般是.so文件,Windows下则是.dll文件了。
  之所以给学会带上双引号,是因为C语言很难学会。C语言与计算机底层的联系太过于紧密了,真正的学会,应该对计算机体系结构、计算机组成原理、微机接口和操作系统原理等知识都有比较深的造诣了。

  一直不明白软考中,为什么一定要重点考C语言,也许也是因为C语言是比较接近低级语言的高级语言吧。

  为什么是Linux C?如果有朝一日,我也能”学会”C语言的话,再来谈谈它和Windows C的区别。

  下面是地址:
  http://learn.akae.cn/media/index.html

相关文章

  • 没有相关内容

最后一篇了,原以为就一点点内容的。没想到还是写了这么多……

继续阅读 »

相关文章

继续……还是WordPress的扩展配置。

继续阅读 »

相关文章

继续上次话题,谈WordPress的配置。如果说前一篇中的内容是地球人都知道的东西的话。这篇开始可能会比前一篇的内容有意义和有意思一点,就是对配置的一些扩展用法。

继续阅读 »

相关文章

使用WordPress也有两个月了吧,一直都没有时间好好的看下源代码。这么广受好评的东东,应该有很多值得学习的地方。于是就静下心来,好好的研究一下。我用的版本是目前最新的WordPress 3.0.4。由于本人水平实在非常有限,如果有错误或不当的地方,请看到的朋友一笑了之或者留言告之,或者给我写邮件

继续阅读 »

相关文章

继续说自己正在用的插件。今天去看了下已经有179个插件了,增长的速度也挺快的。从这篇开始就不再啰嗦个没完了,因为各个插件的用法都大同小异,就算有真有不明白的地方或需要配置的地方,也可以自己花些时间琢磨一下就出来了。所以……Go on…… 继续阅读 »

相关文章

继续上次的内容,上回说到对于程序员博主来说,必不可少的代码格式化类的插件,重点介绍了Code Snippet这款。这篇说说Paste From Console。一个用于格式化终端内容的插件。对于phper来说,有时候是要操作命令行的(比如用pear的时候)。

继续阅读 »

相关文章

© 2011 新翼传说 Suffusion theme by Sayontan Sinha