5、魔术常量<br />
PHP提供了获取当前行号(__LINE__)、<br />
文件路径(__FILE__)、<br />
目录路径(__DIR__)、<br />
函数名(__FUNCTION__)、<br />
类名(__CLASS__)、<br />
方法名(__METHOD__)和命名空间(__NAMESPACE__)等有用的魔术常量。在这篇文章中不作一一介绍,但是我将告诉你一些用例。当包含其他脚本文件时,使用__FILE__常量(或者使用PHP5.3新具有的__DIR__常量):<br />
<br />
//this is relative to the loaded script's path <br />
//it may cause problems when running scripts from different directories <br />
require_once('config/database.php'); <br />
//this is always relative to this file's path <br />
//no matter where it was included from <br />
require_once(dirname(__FILE__).'/config/database.php'); <br />
使用__LINE__使得调试更为轻松。你可以跟踪到具体行号。<br />
以下为引用的内容: <br />
//somecode <br />
//... <br />
my_debug("some debugmessage",__LINE__); <br />
/*prints <br />
Line4:some debug message <br />
*/ <br />
//some more code <br />
//... <br />
my_debug("another debug message",__LINE__); <br />
/*prints <br />
Line11:another debug message <br />
*/ <br />
function my_debug($msg,$line){ <br />
echo"Line$line:$msg <br />
<br />
6、生成唯一标识符<br />
某些场景下,可能需要生成一个唯一的字符串。我看到很多人使用md5()函数,即使它并不完全意味着这个目的:<br />
以下为引用的内容: <br />
//generate unique string <br />
echo md5(time().mt_rand(1,1000000)); <br />
There is actually a PHP function named uniqid() that is meant to be used for this. <br />
//generate unique string <br />
echo uniqid(); <br />
/*prints <br />
4bd67c947233e <br />
*/ <br />
//generateanotheruniquestring <br />
echo uniqid(); <br />
/*prints <br />
4bd67c9472340 <br />
*/ <br />
你可能会注意到,尽管字符串是唯一的,前几个字符却是类似的,这是因为生成的字符串与服务器时间相关。但实际上也存在友好的一方面,由于每个新生成的ID会按字母顺序排列,这样排序就变得很简单。为了减少重复的概率,你可以传递一个前缀,或第二个参数来增加熵。<br />
<br />
以下为引用的内容: <br />
//withprefix <br />
echo uniqid('foo_'); <br />
/*prints <br />
foo_4bd67d6cd8b8f <br />
*/ <br />
//withmoreentropy <br />
echo uniqid('',true); <br />
/*prints <br />
4bd67d6cd8b926.12135106 <br />
*/ <br />
//both <br />
echo uniqid('bar_',true); <br />
/*prints <br />
bar_4bd67da367b650.43684647 <br />
*/ <br />
这个函数将产生比md5()更短的字符串,能节省一些空间。<br />
<br />
7、序列化<br />
<br />
你有没有遇到过需要在数据库或文本文件存储一个复杂变量的情况?你可能没能想出一个格式化字符串并转换成数组或对象的好方法,PHP已经为你准备好此功能。有两种序列化变量的流行方法。下面是一个例子,使用serialize()和unserialize()函数。以下为引用的内容:<br />
//acomplexarray <br />
$myvar=array( <br />
'hello', <br />
42, <br />
array(1,'two'), <br />
'apple' <br />
); <br />
//converttoastring <br />
$string=serialize($myvar); <br />
echo$string; <br />
/*prints <br />
a:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";} <br />
*/ <br />
//youcanreproducetheoriginalvariable <br />
$newvar=unserialize($string); <br />
print_r($newvar); <br />
/*prints <br />
Array <br />
( <br />
[0]=>hello <br />
[1]=>42 <br />
[2]=>Array <br />
( <br />
[0]=>1 <br />
[1]=>two <br />
) <br />
[3]=>apple <br />
) <br />
*/ <br />
这是原生的PHP序列化方法。然而,由于JSON近年来大受欢迎,PHP5.2中已经加入了对JSON格式的支持。现在你可以使用json_encode()和json_decode()函数,以下为引用的内容:<br />
//acomplexarray <br />
$myvar=array( <br />
‘hello’, <br />
42, <br />
array(1,’two’), <br />
‘apple’ <br />
); <br />
//converttoastring <br />
$string=json_encode($myvar); <br />
echo$string; <br />
/*prints <br />
["hello",42,[1,"two"],”apple”] <br />
*/ <br />
//youcanreproducetheoriginalvariable <br />
$newvar=json_decode($string); <br />
print_r($newvar); <br />
/*prints <br />
Array <br />
( <br />
[0]=>hello <br />
[1]=>42 <br />
[2]=>Array <br />
( <br />
[0]=>1 <br />
[1]=>two <br />
) <br />
<br />
[3]=>apple <br />
) <br />
*/ <br />
这将更为行之有效,尤其与JavaScript等许多其他语言兼容。然而对于复杂的对象,某些信息可能会丢失。