PHP引用变量

PHP基础知识总结

PHP 引用变量

问题:什么时引用变量?在PHP中,用什么符号定义引用变量?

概念:引用变量的定义和引用方式

延申:PHP引用变量的原理

引用变量

定义:在PHP中意味着用不同的名字访问同一个变量内容

定义方式: 使用&符号

1
2
3
$a = 100;
//引用变量
$b = &$a;

工作原理:

第一步定义$a 时需要开辟一块内存空间用于保存$a,常规赋值时,在被赋值变量改变时,根据COW特性,会进行copy操作,引用变量时,相当于给当前开辟的内存空间一个别名,对a变量的修改也会提现在b变量上

PHP COW 特性 Copy On Write

示例代码:

1
2
3
4
5
6
7
8
9
10
<?php
echo "<pre>";
$a = range(1,100000);
var_dump(memory_get_usage());
$b = &$a;
var_dump(memory_get_usage());
$c = $a;
var_dump(memory_get_usage());
$a = range(1,100000);
var_dump(memory_get_usage());

输出:

1
2
3
4
int(6687584)
int(6687608)
int(6687608)
int(12979144)

注意:

unset只会取消引用,不会销毁内存空间

对象赋值是引用传值,如果想不使用引用,需要克隆对象

PHP字符串定义方式及各自的区别

定义方式:

  • 单引号

  • 双引号

  • heredocnewdoc

区别:

  • 单引号不能解析变量
  • 单引号不能解析转义字符,只能解析单引号和反斜线
  • 变量和变量、变量和字符串、字符串和字符串之间可以用.连接
  • 双引号可以解析变量,变量可以使用特殊字符和{}包含
  • 双引号可以解析所有转义字符
  • 单引号效率高于双引号
  • Heredoc类似双引号
  • Newdoc类似单引号

数据类型

8大数据类型

  • 标量
    • 浮点类型(浮点不能用与精确相等判断)
    • 布尔类型 (0,0.0,“”,false,array(),NULL)
    • 数组类型
      • 超全局数组
        • $GLOBALS
        • $_GET
        • $_POST
        • $_REQUEST
        • $_SESSION
        • $_SERVER
          • SERVER_ADDR 服务器ip
          • SERVER_NAME 服务器名称
          • HTTP_REFERER Referer
          • REMOTE_ADDR 客户端ip
          • PATH_INFO

复合

特殊

  • NULL

    变量直接赋值为NULL,未定义的变量,unset销毁的变量 都为NULL

  • 常量

    定义:

    const 和 define

    1
    2
    const ADF = "asd";
    define("ADF","asd");

    预定义常量:

    1
    2
    3
    4
    5
    6
    7
    8
    __FILE__;      //所在文件路径+文件名
    __LINE__; //行号
    __DIR__; //目录
    __FUNCTION__; //方法名
    __CLASS__; //类名
    __TRAIT__; // Trait 的名字
    __METHOD__; //类名加方法名
    __NAMESPACE__; //命名空间名称

运算符

foo()和@foo()之间的区别

  • 错误控制符@

延申 :PHP运算符知识点

  • 比较运算符

    == 和 === 的区别

    == 判断值是否相等

    === 判断之和类型是否相等

    等值判断 FALSE的其中情况是等值的

  • 递增/递减运算符

    递增递减不影响布尔值

    递减对NULL没有效果

    递增NULL值为1

    递增和递减在前先运算后反回,反之就先返回后运算

  • 逻辑运算符

    短路作用:

    || && 与or和and的优先级的不同

错误控制符:

PHP支持一个错误运算符:@ 当将其放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略

流程控制

问题:请列出3中PHP数组循环操作的语法,并注明各种循环的区别

知识点:

  • PHP遍历数组的三种方式及各自区别

    • 使用for 循环

      for循环只能遍历索引数组

      1
      2
      3
      4
      5
      $arr = range(1,20);
      $length = count($arr);
      for($i=0;$i<$length;$i++){
      echo $arr[$i]."<br>";
      }
    • 使用foreach 循环

      foreach既可以遍历索引,也可以遍历关联

      foreach遍历会对数组进行reset()操作

      1
      2
      3
      4
      $arr = range(1,20);
      foreach($arr as $k => $v){
      echo $v . '<br>';
      }
    • while , list() , each() 组合循环

      组合循环同样可以遍历索引和关联数组

      组合循环不会进行reset()操作,即将数组的指针移动到开头

      1
      2
      3
      while(list($k,$v) = each($arr)){
      echo $v.'<br>';
      }
  • 延伸:分支结构

    if ... elseif

    在elseif语句中只能有一个表达式而true,即在elseif语句中,只能有一个语句块被执行,多个elseif从句是排斥关系。

    使用elseif语句有一个基本原则,总优先把范围小的条件放在前面处理。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if(exp1){

    }elseif(exp2){

    }elseif(exp3){

    }elseif(exp4){

    }else{

    }

    switch...case...

    和if不同的是,switch后面的控制表达式的数据类型只能是整型、浮点型、或者字符串

    continue语句作用到switch的作用类似于break,跳出switch外的循环,可以使用continue2

    switch…case会生成跳转表 , 直接跳转到对应的case

    效率:如果条件比一个简单的比较要复杂的多,或者在一个很多次的循环中,那么使用switch可能会更快

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    switch($var){
    case ... :
    break;
    case ... :
    break;
    default:

    break;
    }

思考 : PHP中如何优化多个if…elseif…语句等情况?

答:将可能性较大的条件放到前面

​ 如果判断的内容是比较复杂的内容,且值是整型、浮点、或者字符串,可以使用switch…case…

自定义函数及内部函数

问题:写出如下程序的输出结果 51

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$count = 5;
function get_count(){
//静态变量
static $count;
return $count++;
}

echo $count;
++$count;
//此时count为NULL 返回NULL echo输出为空 然后执行NULL++ count变为1
echo get_count();
//此时count为1 返回1 然后执行++ count变2

echo get_count();

涉及知识点:

  • 变量的作用域

    变量的作用域也称做变量的范围,变量的范围即它定义的上下文背景(也是它生效的范围)。大部分的php变量只有一个单独的范围。这个单独的范围跨度同样包含include和require引入的文件。

    global引用全局作用域中的变量

  • 静态变量

    静态变量仅在局部函数域中存在,但当程序执行离开次作用域时,其值并不会消失。

    static 关键字

    1. 仅初始化一次
    2. 初始化时需要赋值
    3. 每次执行函数该值会保留
    4. static修饰的变量是局部的,仅在函数内部有效
    5. 可以记录函数的调用次数,从而可以在某些条件下终止递归
  • 函数的参数和参数的引用传递

  • 函数的返回值和和引用返回

    引用返回 必须在函数声明和指派返回值给一个变量时都使用引用运算符&

    1
    2
    3
    4
    5
    6
    7
    8
    function &get_count(){
    static $count;
    return $count;
    }
    echo get_count();
    $a = &get_count();
    $a = 100;
    echo get_count();
  • 外部文件导入

    includerequire语句包含并运行指定文件

    如果给出路径名按照路径来查找,否则从include_path中查找,如果include_path中也没有,则从调用脚本文件所在目录和当前工作目录下寻找

    当一个文件被包含是,其中所包含的代码继承了include所在行的变量范围

    加载过程中如果没有找到include发出景观 ,require会发出致命错误

    _one 会检查文件是否已经被包含过

  • 系统内置的函数

    • 时间日期函数

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      //时间戳格式化为更易读的日期和时间
      date();

      //将英文文本日期时间解析为 Unix 时间戳:
      strtotime();

      //返回一个日期的 UNIX 时间戳。然后使用它来查找该日期的天:
      mktime();

      //返回当前时间的 Unix 时间戳
      time();

      //返回当前时间Unix时间戳的微秒数
      microtime();

      //设置脚本默认时区
      date_default_timezone_set();
    • IP处理函数

      ip2long long2ip

    • 打印处理

      1
      2
      3
      4
      5
      6
      7
      print();
      print_r();
      printf();
      echo;
      sprintf();
      var_dump();
      var_export();
  • 序列化和反序列化

    serialize()unserialize()

  • 字符串处理函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    implode();
    explode();
    join();

    //字符串反转
    strrev();
    trim();
    ltrim();
    strstr();
    number_format();
  • 数组处理函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    array_keys();
    array_values();
    // 差集
    array_diff();
    //交集
    array_intersect();
    //并集
    array_merge();
    array_shift();
    array_unshift();
    array_pop();
    array_push();
    array_rand();
    //排序
    sort();

正则表达式

写出一个验证139手机号的正则表达式

1
/^139\d{8}$/

正则表达式的作用 : 分割、查找、匹配、替换、字符串

分割符 : 正斜线(/),hash符号(#),取反符号 (~)

通用原子: \d \D \w \W \s \S

元字符: . * ? ^ $ + {n} {n,} {n,m} [] () [^] | [-]

模式修正符 : i m e s U x A D u

后向引用

1
2
$str = '<b>abc</b>';
$pat = '<b>.*<\/b>';

贪婪模式

1
2
3
4
5
6
$str = '<b>abc</b><b>abc</b>';
$pat = '<b>.*<\/b>'; //贪婪模式
$pat = '<b>.*?<\/b>'; //取消贪婪模式
$pat = '<b>.*<\/b>/U'; //取消贪婪模式
//两种取消不能同时使用 否则又变成贪婪
//eg_replace_all($pat,)

中文匹配

UTF-8 汉字编码范围为0x4e00-0x9fa5,在ANSI(gb2312)环境下,0xb0-0xf7,0xa1-0xfe

UTF-8要使用u模式修正符使模式字符串被当成UTF-8,在ANSI(gb2312)环境下,要使用chr将Ascii码转换为字符