PHP的session概念与语法详细讲解

 

cookie的工作流程

由服务器发送给浏览器一个cookie(牌子)

以后再访问时,由浏览器带着cookie(牌子),服务器检测cookie的信息

如何设置cookie: setcookie()函数

如何读取cookie: $_COOKIE[] 超级全局数组

疑问?

问: cookie由浏览器带着的,那么如何被篡改了,怎么办?

比如:你买的奶酪,你把单据改成”蛋糕”,如何防范?

因为cookie是很容易被篡改或伪造的,

因此,cookie往往用来记住用户名,浏览历史,等安全性要求不高的地方.

能否防范呢?

 

答:能,可以用session技术

也可以通过一些加密技巧来防范.

一般情况打印出的结果是:普通客户,爱买不买

如果,把cookie值手动的在浏览器改为vip。结果就可想而知!那么如何规避这种情况呢?

session

先用session来处理

思考?

对于cookie,相当于蛋糕店的老板给你一张纸,

纸上写你领取的物品: 奶酪,蛋糕等,

这个纸片在你手里,容易篡改,刚才大家已经看到.

 

现在换个思路:

你买了蛋糕后,老板给你一张收据,收据上写:”单号:1018″

你取物品时,老板打开账本,核对:

1018:八寸蛋糕一份!

取出八寸蛋糕给你!

这一次,不好伪造了.

session

session

怎么通过以上cookie凭证找到liudehua这几个字的?

打开php.ini找到:

http://php.net/session.save-path

session.save_path = “d:/wamp/tmp”

session路径

session详细语法学习

session的创建、修改、销毁

1:无论是创建,修改,还是销毁session,都需要先session_start();

2:一但session_start之后,$_SESSION就可以自由的添加,删除,修改

即:当成普通数组一样操作(这一点和cookie,cookie的操作,只能通过setcookie函数来进行)

探讨session的生命周期!

我们知道,一个session,有2方面的数据共同发挥作用

1:客户端的cookie

2:服务器端的session文件

要想让session失效,也是要从这2个角度来考虑

在php.ini里, 如下选项,控制sessionid的cookie的生命周期,秒为单位

session.cookie_lifetime = 15

注意:如果用户篡改了cookie,让cookie的生命周期为1年,那你也判断不出来.

如果想严格的让session就半小时有效,可以这样:

$_SESSION[‘time’] = 登陆时的时间戳

检验session的开启时间!

session的有效路径!

session的有效,取决于cookie,

cookie在哪儿有效,session自然就能读到

PHP如下选项,指定了sessionid这个cookie的有效路径是 / 路径,

自然session无论在多深的目录下设置,而session在整站都有效.

; The path for which the cookie is valid.

; http://php.net/session.cookie-path

session.cookie_path = /

cookie只能存储字符串/数字这样的标量数据

而session还可以存储数组/对象 (除了资源型,其他7种都可以)

请注意:如果你把对象存储到session里,

那么另一个读取session的页面,也必须有此对象对应的类声明才合理.

否则,从session里分析出一个对象,却没有与之对应的类,则会提示:

__PHP_Incomplete_Class Object

从http协议的角度看

cookie信息是放在头信息里传输的,

自然,使用cookie之前,不能有任何主体信息的输出,空白也不行

Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent

如果你仔细检测,没有空白,请检查BOM信息

PHP深入理解cookie概念与cookie的设置与读取并完成浏览历史功能

设置COOKIE

cookie

读取COOKIE

cookie

参数设置cookie

setcookie()可以用2个参数,3个参数,4个参数,5个参数来设置

销毁cookie

用cookie来完成浏览历史功能

用cookie来记录来本网站已经访问了多少页面,如果这个页面是第1次访问,是没有cookie信息的,所以第二次访问才会输出第一次访问,所以+1

cookie来做浏览历史

浏览历史记录

 

 

 

PHP应用GD库-开发缩略图与水印类

获取图像文件大小、图像的尺寸、文件类型


getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。

图片操作类:画布四个角的坐标水印,缩略图的两边留白!


[img]水印处理 水印处理2 水印处理3 水印处理4[/img]

两边留白

PHP应用GD库-图片缩略图以及水印函数

图像复制(水印)/图像半透明提制/图像的按比例复制(缩略)

在画布上复制两张图片,第二张图片位于第一张右边的20像素处

bool imagecopy ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h )

参数分析:画布资源、小图、画布x轴、画布y轴、小图x轴、小图y轴、小图宽、小图高。

在画布上复制两张图片,第二张图片位于第一张右边的20像素处!

 

 

问:复制的图片能否小一点呢?复制的图片能否带点透明效果呢?

重采样拷贝部分图像并调整大小

bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )

参数分析:画布、小图、画布x、画布y、小图x、小图y、画布宽、画布高、小图宽、小图高。

问:复制的图片能否小一点呢?复制的图片能否带点透明效果呢?

 

 

透明复制

bool imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )

参数分析:画布资源、小图资源、画布x、画布y、小图x、小图y、小图宽、小图高、合并程度。

当为 pct = 100 时对于调色板图像本函数和 imagecopy() 完全一样,知道了用法,要实现我们的功能就简单了,用下面的代码就可以轻松实现,代码如下:

透明复制

 

PHP应用GD库-画矩形及饼状图

画图相关函数

画长方形:

bool imagerectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $col )

参数: 画布资源, 左上角x坐标,左上y坐标,右下x坐标,右下y坐标,颜色

画椭圆:

bool imageellipse ( resource $image , int $cx , int $cy , int $w , int $h , int $color )

参数:画布资源,圆心x坐标,圆心y坐标,圆宽,圆高,颜色

画弧:

bool imagearc ( resource $image , int $cx , int $cy , int $w , int $h , int $s , int $e , int $color )

参数为: 画布,圆心x值,圆心y值,宽,高,起始角度,结果角度,颜色

画圆弧并填充:

bool imagefilledarc ( resource $image , int $cx , int $cy , int $w , int $h , int $s , int $e , int $color , int $style )

参数为: 画布,圆心x值,圆心y值,宽,高,起始角度,结果角度,颜色,填充方式

  • 1 IMG_ARC_CHORD 直线连圆弧2端
  • 0 IMG_ARC_PIE 弧线连圆弧2端
  • 4 IMG_ARC_EDGED 指明用直线将起始和结束点与中心点相连,
  • 2 IMG_ARC_NOFILL 不填充轮廓(默认是填充的)

画图


画圆弧


画饼行

PHP应用GD库完成中文验证码功能

PHP应用GD库完成中文验证码功能主要步骤:

  • 创建画布
  • 制造颜色
  • 函数随机生成4个字符
  • 水平地画一行字符串
  • 输出
  • 销毁

GD库实现验证码

验证码画干扰线!

以上代码有的人会说,这样的验证码点击图片为什么不会刷新验证码呢?别急,加一个js不就好了!

以下js纯属为了实现验证码所写的一些步骤,有些代码用的不规范,请各位见谅!


图片里写中文,并做中文验证码功能:

图片里面写中文

中文验证码:

中文验证码

 

PHP中GD库的安装与画图流程详解

GD2库的引入:


打开php.ini,查询gd2.dll

把这一行的注释去掉,重启apache

gd库

gd库相关函数的特点及学习方法:

gd库相关函数—-参数特别多,最多达11个,所以请不要死记.

重在理解:

1:理解绘图的过程

2:理解屏幕的坐标体系

测试gd库的信息,用gd_info函数

GD库

GD库画图的典型流程!


1:创建画布

2:创建各种颜料

3:绘画(如写字,画线,画矩形等形状)

4:保存成图片

5:清理战场,销毁画布!

画图5步详解!


GD画图

PHP商城实战之栏目列表显示(MVC模式)

sql

列表页

catelist.php列表页

  1. <?php
  2. //列表页
  3. header(“Content-type: text/html; charset=utf-8”);
  4. define(‘ACC’,true);
  5. require(‘../include/init.php’);
  6. //————–调用model————–
  7. $cat = new CatModel();                      //实例化Catmodel类
  8. $catlist = $cat->select();                  //调用Catmodel类select方法获取数据 赋值给$catlist.
  9. //print_r($catlist);
  10. $catlist = $cat->getCatTree($catlist,0);    //把$catlist调用Catmodel类的getCatTree方法查询到的数据再赋值给$catlist.
  11. //print_r($catlist);
  12. //使用$catlist到catelist.html   foreach循环展示出来.
  13. include(ROOT . ‘view/admin/templates/catelist.html’);

model方法:

  1. //———获取列表下面的数据———
  2.     public function select(){
  3.         $sql = ‘select cat_id,cat_name,parent_id from ‘ . $this->table;//sql语句
  4.         return $this->db->getAll($sql);                         //mysql类中的getAll方法,返回给自身!
  5.     }
  6. //———查找子孙树———
  7.     public function getCatTree($arr,$id = 0,$lev = 0){
  8.         $tree = array();
  9.         foreach($arr as $v){                                    //循环数组  值
  10.             if($v[‘parent_id’] == $id){                         //判断父id等于传过来的id
  11.                 $v[‘lev’] = $lev;
  12.                 $tree[] = $v;                                   //把值赋值给$tree数组
  13.                 $tree = array_merge($tree,$this->getCatTree($arr,$v[‘cat_id’],$lev+1));
  14.             }                                                   //调用自身,用$id循环$arr数组中的子孙树.
  15.         }
  16.         return $tree;                                           //返回给自身.
  17.     }

Foreach循环读取数据库的栏目名称(catelist.html)

  1.   <?php foreach($catlist as $v){?>
  2.   <tr align=“center” class=“0” id=“0_1” id = ‘tr_4’>
  3.   <td align=“left” class=“first-cell” style = ‘padding-left=”1″‘>
  4.           <img src=“../view/admin/images/menu_minus.gif” id=“icon_0_1” width=“9” height=“9” border=“0” style=“margin-left:<?php echo $v[‘lev’];?>em” />
  5.           <span><a href=“#” ><?php echo $v[‘cat_name’]; ?></a></span>
  6.       </td>
  7.   <td width=“10%”>0</td>
  8.   <td width=“10%”><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></td>
  9.   <td width=“10%”><img src=“../view/admin/images/yes.gif” /></td>
  10.   <td width=“10%”><img src=“../view/admin/images/yes.gif” /></td>
  11.   <td><span>0</span></td>
  12.   <td width=“10%” align=“right”><span>50</span></td>
  13.   <td width=“24%” align=“center”>
  14.     <a href=“#”>转移商品</a> |
  15.     <a href=“”>编辑</a> |
  16.     <a href=“” title=“移除”>移除</a>
  17.   </td>
  18. </tr>
  19. <?php }?>

数据库类方法详见:PHP商城实战之栏目的添加(MVC模式)

PHP商城实战之栏目的添加(MVC模式)

第一步:sql建表

  1. #栏目表
  2. create table category (
  3. cat_id int auto_increment primary key,
  4. cat_name varchar(20) not null default,
  5. intro varchar(100) not null default ,
  6. parent_id int not null default 0
  7. )engine myisam charset utf8;

第二步:表单页,POST发送表单 到  cateaddAct.php

表单页

  1. <form action=“cateaddAct.php” method=“post” name=“theForm” enctype=“multipart/form-data”>
  2. <table width=“100%” id=“general-table”>
  3.     <tr>
  4.       <td class=“label”>分类名称:</td>
  5.       <td>
  6.         <input type=‘text’ name=‘cat_name’ maxlength=“20” value= size=’27’ /> <font color=“red”>*</font>
  7.       </td>
  8.     </tr>
  9.     <tr>
  10.       <td class=“label”>上级分类:</td>
  11.       <td>
  12.         <select name=“parent_id”>
  13.                       <option value=“0”>顶级分类</option>
  14.                       <?php foreach($catlist as $v){?>
  15.                       <option value=“<?php echo $v[‘cat_id’]; ?>”>
  16.                       <?php echo str_repeat(‘&nbsp;’,$v[‘lev’]),$v[‘cat_name’]; ?></option>
  17.                       <?php } ?>
  18.                     </select>
  19.       </td>
  20.     </tr>
  21.     <tr>
  22.       <td class=“label”>栏目简介:</td>
  23.       <td>
  24.         <textarea name=‘intro’ rows=“6” cols=“48”></textarea>
  25.       </td>
  26.     </tr>
  27.     </table>
  28.     <div class=“button-div”>
  29.       <input type=“submit” value=” 确定 “ />
  30.       <input type=“reset” value=” 重置 “ />
  31.     </div>
  32.   <input type=“hidden” name=“act” value=“insert” />
  33.   <input type=“hidden” name=“old_cat_name” value=“” />
  34.   <input type=“hidden” name=“cat_id” value=“” />
  35. </form>

第三步:cateaddAct.php接收数据,校验数据,调用model,添加成功/失败

  1. <?php
  2. header(“Content-type: text/html; charset=utf-8”);
  3. /*
  4. file cateaddAct.php
  5. 作用:接收cateadd.php表单发送过来的数据
  6. 并调用Model,把数据库入库
  7. */
  8. //———接收cateadd.html表单页POST传过来的数据———
  9. define(‘ACC’,true);
  10. require(‘../include/init.php’);
  11. //第一步,接收数据
  12. //print_r($_POST);
  13. //———第二步,校验数据———
  14. $data = array();
  15. if(empty($_POST[‘cat_name’])){              //校验POST传过来的cat_name
  16.     exit(‘栏目名不能为空’);                 //如果为空,退出
  17. }
  18. $data[‘cat_name’] = $_POST[‘cat_name’];     //不为空,把$_POST[‘cat_name’]赋值给$data[‘cat_name’]
  19.                                             //同理判断intro及父栏目id是否合法
  20. $data[‘parent_id’] = $_POST[‘parent_id’];   //把$_POST[‘parent_id’];赋值给$data[‘parent_id’]
  21. $data[‘intro’] = $_POST[‘intro’];           //把$_POST[‘intro’];赋值给$data[‘intro’]
  22. //print_r($data); exit;
  23. //———第三步,实例化model———
  24. $cat = new CatModel();
  25. if($cat->add($data)){                       //判断  调用model的add方法
  26.     echo ‘栏目添加成功’;
  27.     exit;
  28. }else{
  29.     echo ‘栏目添加失败’;
  30.     exit;
  31. }
  32. ?>

调用CatModel方法

model.php

  1. defined(‘ACC’)||exit(‘ACC Denied’);
  2. class Model {
  3.     protected $table = NULL; // 是model所控制的表
  4.     protected $db = NULL; // 是引入的mysql对象
  5.     public function __construct() {
  6.         $this->db = mysql::getIns();
  7.     }
  8.     public function table($table) {
  9.         $this->table = $table;
  10.     }
  11. }

catemodel.php

  1. class CatModel extends Model{
  2.     protected $table = ‘category’;                              //category表
  3.     /*
  4.        你给我一个关键数组,键–>表中的列,值–>表中的值
  5.        add()函数自动插入改行数据
  6.     */
  7. //———插入列表数据———
  8.     public function add($date){                                 //cateaddAct.php调用此方法
  9.     return $this->db->autoExecute($this->table,$date);          //mysql类中的autoExecute方法拼接sql插入数据

mysql.class.php数据库类

  1. <?php
  2. /****
  3. 燕十八 公益PHP讲堂
  4. 论  坛: http://www.zixue.it
  5. 微  博: http://weibo.com/Yshiba
  6. YY频道: 88354001
  7. ****/
  8. defined(‘ACC’)||exit(‘ACC Denied’);
  9. class mysql extends db {
  10.     private static $ins = NULL;
  11.     private $conn = NULL;
  12.     private $conf = array();
  13.     protected function __construct() {
  14.         $this->conf = conf::getIns();
  15.         $this->connect($this->conf->host,$this->conf->user,$this->conf->pwd);
  16.         $this->select_db($this->conf->db);
  17.         $this->setChar($this->conf->char);
  18.     }
  19.     public function __destruct() {
  20.     }
  21.     public static function getIns() {
  22.         if(!(self::$ins instanceof self)) {
  23.             self::$ins = new self();
  24.         }
  25.         return self::$ins;
  26.     }
  27.     public function connect($h,$u,$p) {
  28.         $this->conn = @mysql_connect($h,$u,$p);
  29.         if(!$this->conn) {
  30.             $err = new Exception(‘连接失败’);
  31.             throw $err;
  32.         }
  33.     }
  34.     protected function select_db($db) {
  35.         $sql = ‘use ‘ . $db;
  36.         $this->query($sql);
  37.     }
  38.     protected function setChar($char) {
  39.         $sql = ‘set names ‘ . $char;
  40.         return $this->query($sql);
  41.     }
  42.     public function query($sql) {
  43.         $rs = mysql_query($sql,$this->conn);
  44.         log::write($sql);
  45.         return $rs;
  46.     }
  47.     public function autoExecute($table,$arr,$mode=’insert‘,$where = ‘ where 1 limit 1′) {
  48.         /*    insert into tbname (username,passwd,email) values (,)
  49.         /// 把所有的键名用’,’接起来
  50.         // implode(‘,’,array_keys($arr));
  51.         // implode(“‘,'”,array_values($arr));
  52.         */
  53.         if(!is_array($arr)) {
  54.             return false;
  55.         }
  56.         if($mode == ‘update‘) {
  57.             $sql = ‘update ‘ . $table .’ set ‘;
  58.             foreach($arr as $k=>$v) {
  59.                 $sql .= $k . “='” . $v .“‘,”;
  60.             }
  61.             $sql = rtrim($sql,’,’);
  62.             $sql .= $where;
  63.             return $this->query($sql);
  64.         }
  65.         $sql = ‘insert into ‘ . $table . ‘ (‘ . implode(‘,’,array_keys($arr)) . ‘)’;
  66.         $sql .= ‘ values (\;
  67.         $sql .= implode(“‘,'”,array_values($arr));
  68.         $sql .= ‘\’)’;
  69.         return $this->query($sql);
  70.     }
  71.     public function getAll($sql) {
  72.         $rs = $this->query($sql);
  73.         $list = array();
  74.         while($row = mysql_fetch_assoc($rs)) {
  75.             $list[] = $row;
  76.         }
  77.         return $list;
  78.     }
  79.     public function getRow($sql) {
  80.         $rs = $this->query($sql);
  81.         return mysql_fetch_assoc($rs);
  82.     }
  83.     public function getOne($sql) {
  84.         $rs = $this->query($sql);
  85.         $row = mysql_fetch_row($rs);
  86.         return $row[0];
  87.     }
  88.     // 返回影响行数的函数
  89.     public function affected_rows() {
  90.         return mysql_affected_rows($this->conn);
  91.     }
  92.     // 返回最新的auto_increment列的自增长的值
  93.     public function insert_id() {
  94.         return mysql_insert_id($this->conn);
  95.     }
  96. }

 

PHP无限级分类,求家谱树_用迭代来找家谱树

无限级分类,求家谱树

家谱树的应用 ,如面包屑导航 首页 > 手机类型 > CDMA手机 > 公益PHP > 递归应用

$area = array(

array(‘id’=>1,’name’=>’淄博’,’parent’=>0),

array(‘id’=>2,’name’=>’市北’,’parent’=>7),

array(‘id’=>3,’name’=>’兰雁大道’,’parent’=>5),

array(‘id’=>4,’name’=>’市南’,’parent’=>7),

array(‘id’=>5,’name’=>’张店’,’parent’=>1),

array(‘id’=>6,’name’=>’黄岛’,’parent’=>7),

array(‘id’=>7,’name’=>’青岛’,’parent’=>0),

array(‘id’=>8,’name’=>’辽宁路’,’parent’=>2)

);

人肉上地的家谱树

辽宁路[parent == 2]

市北[id==2,parent==7]

青岛[id==7,parent==0]

parnet==0,到头了…..

思路:只要parent!=0,就继续找

 

PHP无限级分类之查找子孙树,课程问题分析【图】

这几天关于学习燕十八老师的【PHP无限级分类之查找子孙树】课程出现如下问题,

  1. header(“Content-type:text/html;charset=utf-8”);
  2. $area = array(
  3. array(‘id’=>1,’name’=>’淄博’,’parent’=>0),
  4. array(‘id’=>2,’name’=>’市北’,’parent’=>7),
  5. array(‘id’=>3,’name’=>’兰雁大道’,’parent’=>5),
  6. array(‘id’=>4,’name’=>’市南’,’parent’=>7),
  7. array(‘id’=>5,’name’=>’张店’,’parent’=>1),
  8. array(‘id’=>6,’name’=>’黄岛’,’parent’=>7),
  9. array(‘id’=>7,’name’=>’青岛’,’parent’=>0),
  10. array(‘id’=>8,’name’=>’辽宁路’,’parent’=>2)
  11. );
  12. function subtree($arr,$id=0,$lev=1) {
  13.     $subs = array(); // 子孙数组
  14.     foreach($arr as $v) {
  15.         if($v[‘parent’] == $id) {
  16.             $v[‘lev’] = $lev;
  17.             $subs[] = $v;
  18.             subtree($arr,$v[‘id’],$lev+1);
  19.         }
  20.     }
  21.     return $subs;
  22. }
  23. print_r(subtree($area,0));
  24. /*
  25. 打印结果
  26. Array
  27. (
  28.     [0] => Array
  29.         (
  30.             [id] => 1
  31.             [name] => 淄博
  32.             [parent] => 0
  33.             [lev] => 1
  34.         )
  35.     [1] => Array
  36.         (
  37.             [id] => 7
  38.             [name] => 青岛
  39.             [parent] => 0
  40.             [lev] => 1
  41.         )
  42. )
  43. */

根据以上代码为什么只打印出了,parent=0的淄博跟青岛?

这道题困惑了我一整天,幸好由网友【简单尛幸福】不耐其烦的为我讲解了关于运行的过程才知道怎么执行的!

原来是$subs数组每一次调用都会产生一个新的数组最后在依次返回(递归)最后只会出现parent=0的地区[淄博 青岛]。(在递归运行内部调用返回的时候,内部的$subs数组并没有给外部的数组,所以最后只会打印最外部的数组)如果想要每一次调用查到的地区都会被打印出来的话,就在$subs数组前加一个static转换为静态数组每次得到的结果就会被保存下来了,特画了一张图做下备份。如下图:

查找子孙树

相关阅读:

PHP无限级分类之查找子孙树

 

PHP无限级分类之查找子孙树

对于下面这个数组,每个单元有自己的id和地区名

每个单元之间的地位是平等的

因此谈不上谁是谁的上级/下级

我们为了表示地区之间的上下级关系,人为的加了一个字段

parent

parent的值 是 该栏目的父栏目的id

找A栏目的子栏目时: 谁的parnet值等于A的id值,谁就是A的儿子

$area = array(

array(‘id’=>1,’name’=>’淄博’,’parent’=>0),

array(‘id’=>2,’name’=>’市北’,’parent’=>7),

array(‘id’=>3,’name’=>’兰雁大道’,’parent’=>5),

array(‘id’=>4,’name’=>’市南’,’parent’=>7),

array(‘id’=>5,’name’=>’张店’,’parent’=>1),

array(‘id’=>6,’name’=>’黄岛’,’parent’=>7),

array(‘id’=>7,’name’=>’青岛’,’parent’=>0),

array(‘id’=>8,’name’=>’辽宁路’,’parent’=>2)

);

顺着这层关系,我们可以分析出:

子孙树

无限级分类,牵涉3个应用

0是 找指定栏目的子栏目

1是 找指定栏目的子孙栏目,即子孙树

2是 找指定的栏目的父栏目/父父栏目….顶级栏目, 即家谱树

 

使用到的知识点:

 

相关阅读:

PHP无限级分类之查找子孙树,课程问题分析【图】

递归读取目录_递归计算1-5的和

用耍赖法打印级联目录

要想理解递归,你必须理解电影中的”慢动作”.

要把函数的运行过程理解的非常慢

递归读取目录

 

递归对数组进行转义_在tieba项目中,有同学报出这么两种错误

在tieba项目中,有同学报出这么两种错误.

第2个函数,用的是引用传值,

函数内部的$age 和 全局$age 指向的是同一个变量地址.

因此,内部变化,影响了外部的变量

 

但是–仔细思考,这种写法,有一个非常不好的地方

违反了封装性.

 

函数运行之后,对外部的环境应该是”没有副作用的”.

因此:对函数进行引用传参,是不推荐的!

在PHP5.0以上就不推荐了,

PHP5.4的时候,干脆删除了引用传参这个功能.

 

因此:allow_call_time_pass_reference = Off

这个选项如果off,即不推荐引用传参,会报warning

 

而在php5.4版本中,彻底不允许引用传参,

因此,报fatal error

 

解决办法:

1: allow_call_time_pass_reference = On 重启apache

但不推荐这样来做,归根结底,引用传参数不够规范.

2: 不引用传参,自己写方法来递归的转义数组

递归对数组进行转义