目录

PHP引用(&)使用简介

引用”的概念

跟C和java这些语言一样,PHP也是有引用这个概念的,指的是不同的名字(变量)访问同一个变量内容。表现为在变量或者函数、对象等前面加上&符号

“引用”的相关例子

1. 变量的引用

1
2
3
4
5
6
7
8
9
<?php 
  $a = "123";
  $b = &$a;
  var_dump($a);//这里输出:123
  var_dump($b);//这里输出:123
  $b="321";
  var_dump($a);//这里$a的值变为321 所以输出321
  var_dump($b);//这里输出321
  ?> 

2. 变量引用和函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php 
$a = 10;
//调用函数的时候用了引用了变量,修改了变量指向的内容
function add(&$number){
  $number += 1;
  return $number;
}

var_dump($a);//输出11
var_dump($a);//输出11
add($a);//调用函数的时候用了引用了变量a,修改了变量a指向的内容
var_dump($a);//输出12
$c = add(1);//报错,变量才能作为引用对象
?>

3. 函数的引用返回

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
static $b=0;//申明一个静态变量
function &test(){ 
    $b=$b+1; 
    echo $b; 
    return $b; }
}
$a=test();//这条语句会输出 $b的值 为1 
$a=5; $a=test();//这条语句会输出 $b的值 为2
$a=&test();//这条语句会输出 $b的值 为3
$a=5; $a=test();//这条语句会输出 $b的值 为6
?> 

对PHP“引用”看法

php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。有点鸡肋,一般我也不常用,有时用于对某个变量进行复杂操作。如下面,我需要从15道题目随机选取5道且不重复的题目,由于有递归,用上引用的话方便变量的绑定.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
  /**
   * Author: kayoon
   * Date  : 2018/11/24
   * Time  : 下午12:08
   * Desc  : function 用递归方式从15道题中筛选不重复的5道题目
   * Ver   : v1.0
   * @param $randArray 题目库的id或者下标集合
   * @param $count  剩余需要抽取的题目
   * @param $resultArray 抽渠到的题目
   * @return mixed
   */
   function array_rand($randArray,$count,&$resultArray){
    $randNum = rand(0,count($randArray)-1);
    array_push($resultArray,$randArray[$randNum]);
    unset($randArray[$randNum]);
    $count = $count - 1;
    $randArray = array_values($randArray);//重置索引
    if($count == 0){
      return $resultArray;
    }
    else{
      array_rand($randArray,$count,$resultArray);
    }

  }

  /*
   *抽选题库
   */
  $randArray = array();

  for ($i = 1; $i <= 15; $i++ ){
    array_push($randArray,array("index"=>$i));
  }

  $oriArray = array();//初始化
  array_rand($randArray,5,$oriArray);
  var_dump($oriArray);
  //选中的第一道题是题目库第9题,选中的第二道题是题目库的第十题,以此类推
?>