PHPer 高手之路
  • Introduction
  • First Chapter
  • 基础
    • 数据类型和常量
    • 字符串
      • 字符编码
      • 字符编码相关编程
    • 引用变量
    • 运算符与错误控制符@
    • 流程控制与条件判断
      • foreach遍历中的引用
    • 函数
    • 文件及目录处理
  • PHP 数组
    • 基础
    • PHP数组操作
    • 输入流 php://input
    • PHP数组的内部实现
    • PHP数组和数据结构
    • 示例技巧
  • PHP文件编程
    • 文件系统
    • 基础
    • 实例技巧
    • PHP中XML处理
    • PHP中JSON处理
    • PHP中CSV处理
    • 大文件上传
  • 正则表达式
    • 基础
    • 正则的引擎
    • 表达式的优化
    • PHP中正则的使用
  • PHP 编码技巧
    • PHP编码习惯
    • PHP语法糖
    • PHP代码优化
    • PHP重点新特性
    • PHP编码规范
  • PHP选项和运行原理
    • PHP SAPI
    • PHP运行模式及安装方式
    • 附录:进程和线程的Q解
    • Apache下的MPM模式
    • Apache 与 Nginx
    • PHP的运行机制及原理
    • PHP垃圾回收机制
    • PHP配置选项
  • PHP安全
    • 跨站脚本攻击(XSS )
    • 跨站请求伪造(CRSF)
  • PHP 高级特性
    • 异常处理(Exceptions)
    • 代码复用(Trait)
    • 预定义接口(Predefined Interfaces)
    • 魔术方法(Magic Methods)
    • 回调函数、匿名函数&闭包
    • 命名空间(Namespaces)
    • 自动加载(Autoload)
    • 反射(Reflection)
    • 魔术常量(Magic constants)
    • 综合实例
  • 附录:关键词
  • 附录:资料
  • 代码的版本控制
    • SVN
    • Git
      • 疑难杂症
  • Linux
    • Linux原理与基础
    • 常见命令
    • Shell 编程
    • awk 与 sed
    • 命令笔记
  • HTTP 协议
    • 请求方法与返回状态码
    • Cookie、Session 的原理
  • MySQL
    • MySQL表存储引擎
  • 标准PHP库(SPL)
    • 数据结构
      • SplPriorityQueue - 优先队列
      • SplQueue - 队列
      • SplStack - 栈的功能
    • 接口
      • Countable - count统计接口
  • 附录:ElasticSearch
  • PHP数据结构
  • 附录:Rabbitmq
  • 附录:guzzle
  • JavaScript
    • 附录:资料
  • 疑难杂症
Powered by GitBook
On this page
  • 函数
  • 变量的作用域
  • 静态变量
  • 函数的参数及参数的引用传递
  • 函数的返回值及引用返回
  • 外部文件的引入
  • 总结:

Was this helpful?

  1. 基础

函数

函数

变量的作用域

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

$outer = 'str'; // 全局变量
function myfunction(){
    echo $outer;  // 局部变量
}
myfunction();

全局变量是不能拿到函数体内部使用的,两个$outer并不是一个,所以写程序应该避免这种同名混淆

如果内部想访问使用外部的那个全局变量,但是极力不推荐,如下面两种方式;

$outer = 'str'; // 全局变量
function myfunction(){
    global $outer;
    echo $outer;  // 局部变量
}
myfunction();
$outer = 'str'; // 全局变量
function myfunction(){
    echo $GLOBALS['outer'];  // 局部变量
}

静态变量

static关键词

  • 1.仅初始化一次

  • 2.初始化时需要赋值;

  • 3.每次执行函数该值会保留

  • 4.static 修饰的变量是局部的,仅在函数内部有效

  • 4.可以记录函数的调用次数,从而可以在某些条件下终止递归

function myFunction() {
    static $a = 1;
    echo $a++;
}
myFunction(); // 1
myFunction(); // 2
myFunction(); // 3

示例:

$count = 5;
function get_count()
{
    static $count;  
    return $count++;
}

echo $count; // 5
++$count;

echo get_count(); // null
echo get_count();  // 1

结果51

  • 1.函数内部和外部的count变量不是同一个

  • 2.第一次调用函数时,默认没有赋值的count变量是null,后++,先返回后计算,所以仍然为null

  • 3.第三次时候,返回上次计算过后的null ++ 结果返回(注意:null++的值是1,而null--的值还是null);

函数的参数及参数的引用传递

默认情况下,函数参数通过值传递

如果希望允许函数修改它的值,必须通过引用传递参数

<?php

$count = 5;
get_count($count);
function get_count(&$var)
{
    $var = 1;
}

echo $count;

结果为1

避免使用如下方式:

<?php

$count = 5;
get_count(&$count);
function get_count($var)
{
    $var = 1;
}

echo $count;

函数的返回值及引用返回

函数的返回值:

  • 值通过使用可选的返回语句(return)返回

  • 可以返回包括数组和对象任意类型

  • 返回语句会终止函数执行,将控制权交回函数调用处

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

如下示例:

<?php
function &myFunc(){
    static $b = 10;
    return $b;
}
$a = myFunc();
$a = &myFunc();
$a = 100;
echo  myFunc();

外部文件的引入

include/require语句包含并运行指定文件

如果给出路径名按照路径来找,否则从include_path中查找

如果include_path中也没有,则从调用脚本文件所在的目录和当前工作目录下寻找

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

区别

  • 加载过程中未找到文件则include结构会发出一条警告,这一点和require不同,后者会发出一个致命错误

  • require 在出错时产生E_COMPILE_ERROR级别的错误。换句话说将导致脚本中止而include只产生警告(E_WARNING),脚本会继续运行

  • require(include)/require_once(include_once)唯一区别是PHP会检查该文件是否已经被包含,如果是则不会再次包含。

总结:

<?php
$var1 = 3;
function myfuntion()
{
    global $var1;
    $var1 += 2; // 7
}
myfuntion();
echo $var1;
die;


$var1 = 5;
$var2 = 10;

function foo(&$my_var)
{
    global $var1;//5
    $var1 += 2; // 7
    $var2 = 4; //4
    $my_var += 3; //8
    return $var2; //4
}

$my_var = 5;
echo foo($my_var). "\n"; //4
echo $my_var. "\n"; //8
echo $var1; //7
echo $var2; //10
$bar = 'foo';
$my_var = 10;
echo $bar($my_var). "\n"; //4
die;

function &myFunc(){
    static $b = 10;
    return $b;
}
$a = myFunc();
$a = &myFunc();
$a = 100;
echo  myFunc();

特别注意上面函数内部global的问题,运行函数,同时会改变外部变量的值,得出7。

Previousforeach遍历中的引用Next文件及目录处理

Last updated 5 years ago

Was this helpful?

中会得到一条警告说“Call-time pass-by-reference”已经过时了。详情

官方文档