函数

函数的定义:

形式:

function 函数名 ( 【$形参1】 【,$形参2】 【,.... 】 ){

//函数体。。。。。。

}

说明:

  1. 定义时使用的形参,其实就是一个变量——只能在该函数内部使用的变量
  2. 形参作为变量,其名字是“自己定义”——自然应该遵循命名规范;

函数的调用:

函数名($实参1, $实参2, ..... );

说明:

  1. 实参应该跟要调用的函数的形参“一一对应”;
  2. 实参就是“数据值”,可能是直接值(比如5,”abc”),也可能是变量值(比如$v1)

函数调用详细过程

  1. 首先,将函数调用时的实参数据,传递(赋值)给函数的形参(变量);

  2. 程序的执行流程,进入到函数内部——此时可以认为是一个跟外界“隔离” 的“独立运行空间”。

  3. 在函数内部,按正常的流程顺序,执行其中的代码;

  4. 直到函数结束,则退出该运行空,而返回到原来调用函数的位置,继续执行后续代码!

  5. 如果在函数内部执行的过程中,有return语句,则也会立即终止函数,并回到函数调用位置。

函数的参数问题

函数形参的默认值问题

我们可以给一个函数定义时的形参,赋值一个“默认值”,则这个函数调用的时候,该形参对应的实参,可以不给值。

函数形参的默认值,可以只给部分形参设置默认值,但设置默认值性的形参,都要放在“右边”(后边):

形参的传值问题

一句话:形参的传值问题,其实就是“变量之间的传值问题”:

其实无非就是实参变量,传值给形参变量的问题。

即:

此时,也同样有两种传值方式:

  • 值传递:

    这是默认值。如果没有特别设定,参数传值都是值传递。

  • 引用传递:

    需要在形参的前面加 &符号:

函数参数的数量问题

  1. 通常,函数调用时的实参数量,应该跟函数定义时的形参数量保持一致。

  2. 如果函数定义时,形参有默认值,则对应的实参就可以进行一定程度的省略:

    注意:省略只能从右往左进行。

  3. 有一种定义和使用函数的特别形式(并不常见):它不定义形参,而实参任意给出。

    其实,系统中也有类似的函数:,比如:

    var_dump($v1);
    var_dump($v1, $v2, $v3); //ok!

    可见,该函数就可以接受任意个数的实参;

    我们自己也可以定义这种函数。其实,这种函数,依赖的是以下3个系统函数来获取相应的信息,以得到实参数据的处理:

    • func_get_args(); //获取实参数据列表,成为一个数组
    • func_get_arg($i); //获取第$i个实参数据,$i从0开始算起;
    • func_num_args(); //获取实参的数量(个数)

    下面就是例子:

函数的返回值问题

一个观念问题:

函数的返回值,不是语法规定,而是应用所需:需要就返回,不需要就无需返回。

返回值,一定是通过return语句!

形式:

function 函数名(....)
{
//.....
return XX数据;
}

注意:

return语句的作用,不管后面跟不跟数据值,都会立即终止函数的执行,返回到函数调用的位置并继续后续工作。

函数的其他形式:

可变函数

先想想可变变量:

$v1 =”abc”;
$abc = 123;
echo $$v1; //输出123,这就是所谓的可变变量。

可变变量:一个变量的名字还是一个变量!

可变函数:一个函数的名字是一个变量!

演示可变函数的一个灵活性使用:

匿名函数

匿名函数就是没有名字的函数。

有2种形式的匿名函数:

  • 形式1:

    将一个匿名函数“赋值”给一个变量——此时该变量就代表该匿名函数了!

  • 形式2:

    是直接将一个匿名函数,当做“实参”来使用!——即调用“别的函数A”的时候,使用一个匿名函数来当做实参。自然,在该函数A中,也就应该对该匿名函数当做一个函数来用!

变量的作用域问题

变量的作用域,就是指:一个变量,在什么范围中可以使用的情况。

php中,有3中变量作用域:

  • 局部作用域:

    就是指一个函数的内部范围。

    对应这样的变量,就称为“局部变量”;

  • 超全局作用域:

    就是指所有的代码范围。

    对应这样的变量,就称为“超全局变量”;

    其实只有系统预定义的几个:$_GET, $_POST, $_SERVER, $_REQUEST, $GLOBALS, $_SESSION, $_COOKIE, $_FILES

  • 全局作用域:

    就是不在函数内部的范围——函数外部。

    对应这样的变量,就称为“全局变量”;

通常,

1,全局范围不能访问局部变量;

2,局部范围不能访问全局变量;

3,函数内部的变量(局部变量),通常在函数调用执行结束后,就被“销毁”了。

4,但有一种局部变量,在函数调用结束后不被销毁:它叫做“静态变量”;

使用形式:

function 函数名 (....){
static $变量名 = 初始值; //这就是静态变量!
....
}

如果在局部作用域使用(访问)全局变量?(常见需求)

有2种做法:

  • 做法1:

    使用global关键字来实现:

  • 做法2:

    使用$GLOBALS超全局变量来实现:

    但,如果我们对$GLOBALS变量的某个单元(也即下标)进行unset,则其就会完全对应销毁该变量。

    这是因为,$GLOBALS对全局变量的使用可以看做是全局变量的另一种语法形式而已,而不是“引用关系”,举例如下:

有关函数的系统函数:

  • function_exists():判断一个函数是否被定义过。其中使用的参数为“函数名”:

  • func_get_arg($i): 获取第i个实参值

  • func_get_args(): 获取所有实参(结果是一个数组)

  • func_num_args(): 获取所有实参的个数。

其他系统函数:

自己会查,并需要去查:

  • 字符串函数:

    • 输出与格式化:echo , print, printf, print_r, var_dump.
    • 字符串去除与填充:trim, ltrim, rtrim, str_pad
    • 字符串连接与分割:implode, join, explode, str_split
    • 字符串截取:substr, strchr, strrchr,
    • 字符串替换:str_replace, substr_replace
    • 字符串长度与位置: strlen, strpos, strrpos,
    • 字符转换:strtolower, strtoupper, lcfirst, ucfirst, ucwords
    • 特殊字符处理:nl2br, addslashes, htmlspecialchars, htmlspecialchars_decode,
  • 时间函数:
    • time, microtime, mktime, date, idate, strtotime, date_add, date_diff, date_default_timezone_set, date_default_timezone_get
  • 数学函数:
    • max, min, round, ceil, floor, abs, sqrt, pow, round, rand

php : 基础(5)的更多相关文章

  1. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  2. node-webkit 环境搭建与基础demo

    首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  5. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

  6. HTTPS 互联网世界的安全基础

    近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...

  7. Swift与C#的基础语法比较

    背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...

  8. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

  9. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  10. .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]

    方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...

随机推荐

  1. 樹的DFS和BFS

    菜鸟心得.... 不对请指出....... /*BFS,广度优先搜索树,用最简单的2叉树来举例, 树的结构如下: A B C D E F GH I J K L M N O广度优先搜索树, 顺序应该是A ...

  2. deepin linux 安装 mysql

    一:安装mysql 打开deepin terminal: 在此过程中会提示输入两次密码,就是输入 root 账号密码,两次输入密码一样就可以了.然后一路Y安装成功. 一旦安装成功,MySql服务器会自 ...

  3. (转)如何将本地git仓库上传到GitHub中托管+实践心得

    Git——新手入门与上传项目到远程仓库GitHub(转) - Chen_s - 博客园http://www.cnblogs.com/Chenshuai7/p/5486278.html 注意的问题: 1 ...

  4. Windows Phone 二十一、联系人存储

    联系人资料是手机上必有的,在最新的 Windows Phone 中开放了相应的 API ,以便于应用程序读写通讯录. 注意:系统没有对整个手机自带的通讯录写入开放权限,每个应用只能管理属于当前应用的联 ...

  5. AppCan JSSDK模块扩展

    1.      从源码开始: 我们先看源码的8188行到9525行: window.appcan && appcan.define('window',function($,export ...

  6. hibernate配置文件详细解析

    在javaweb开发中,hibernate框架的是常用的,能帮我们节省大量的时间,以下是hibernate的配置文件解析. hibernate配置文件的默认名为:hibernate.cfg.xml 默 ...

  7. Android: 解决ADB server didn't ACK

    分析: 1         打开命令行工具, 运行adb start-server 启动服务,报错ADB server didn't ACK, 并且根据错误信息可以得到服务绑定的端口是5037,极有可 ...

  8. window10 安装SVN 提示权限问题

     http://www.yishimei.cn/network/551.html 经常在网上看到有同学反映,他们在控制面板里卸载软件的时候,总是会出现2502.2503错误代码的问题,并且这个问题大多 ...

  9. .net常见的面试题

    1,asp.net中的页生命周期 答:msdn官网已给出标准答案,这里简述一下:页要经历下表概述的8个阶段.除了页生命周期阶段以外,在请求前后还存在应用程序阶段,但是这些阶段并不特定于页. 而这8个阶 ...

  10. babel 解构赋值无法问题

    这个东西需要第二级, babel-preset-stage-2,然后再presets里引入stage-2的设置,再plugins离引入对应的插件 { "presets": [&qu ...