首页 > 开发 > PHP > 正文

基于PHP编程注意事项的小结

2024-05-04 22:27:12
字体:
来源:转载
供稿:网友

 1、php隐性的三元操作符(?:)优先级问题:

例1:
代码如下:
    $person = $who or $person = "laruence"; 

    //实际上是等同于: 

    $person = empty($who)? "laruence" : $who; 

例2
代码如下:
    $arr = array(1=>1,3=>3); 
    $i = 2; 
    $a = 'test‘ . isset($arr[$i]) ? $arr[$i] : $i; 

$a 是什么? 这个问题, 咋一看觉得简单,

$a = ‘test2';

其实仔细推敲后运行的,结果是notice:Undefined index 2..

由于优先级的问题, 连接符的优先级比三元操作符高。

首先是判断 ' test'. isset($arr[$i]) 这个字符串永远是true,因此:

$a =  $arr[$i];以致php提示提醒。
 

2. PHP函数名和类名不区分大小写的,而变量名是区分大小写的。

所以自己写的php模块,往往是大写的问题,编译不通过。

3.系列化传递问题

把复杂的数据类型压缩到一个字符串中
serialize() 把变量和它们的值编码成文本形式
unserialize() 恢复原先变量
代码如下:
    $stooges = array('Moe','Larry','Curly'); 
    $new = serialize($stooges); 
    print_r($new);echo "<br />"; 
    print_r(unserialize($new)); 
    <span style="font-family:Arial;BACKGROUND-COLOR: #ffffff"></span> 

结果:a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";}
Array ( [0] => Moe [1] => Larry [2] => Curly )
当把这些序列化的数据放在URL中在页面之间会传递时,需要对这些数据调用urlencode(),以确保在其中的URL元字符进行处理:
代码如下:
$shopping = array('Poppy seed bagel' => 2,'Plain Bagel' =>1,'Lox' =>4); 
echo '<a href="next.php?cart='.urlencode(serialize($shopping)).'">next</a>';

margic_quotes_gpc和magic_quotes_runtime配置项的设置会影响传递到unserialize()中的数据。
如果magic_quotes_gpc项是启用的,那么在URL、POST变量以及cookies中传递的数据在反序列化之前必须用stripslashes()进行处理:
代码如下:
    $new_cart = unserialize(stripslashes($cart)); //如果magic_quotes_gpc开启 
    $new_cart = unserialize($cart); 

如果magic_quotes_runtime是启用的,那么在向文件中写入序列化的数据之前必须用addslashes()进行处理,而在读取它们之前则必须用stripslashes()进行处理:
代码如下:
$fp = fopen('/tmp/cart','w'); 
fputs($fp,addslashes(serialize($a))); 
fclose($fp); 
//如果magic_quotes_runtime开启 
$new_cat = unserialize(stripslashes(file_get_contents('/tmp/cart'))); 
//如果magic_quotes_runtime关闭 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表