一步一步学习PHP(4) php 函数 补充2


Posted in PHP onFebruary 15, 2010

1. 解决作用域问题

在上一节谈到了PHP中函数的作用域问题,如果说类还不够说明问题,那么在这篇文章中的作用域例子,也许对您更有说服力。

那么,我们如何能在PHP的函数中访问外部的变量呢?

在PHP中,存在一个概念叫做全局作用域,也就是说,如果你不使用函数(未来会有类的概念),那么你创建的变量可以在页面的任何地方访问。那么,我们怎么解决函数体内的问题呢?

我们可以使用global关键字:

<?php 
    $name="kym";
    function Test()
    {
      global $name;
      echo($name);
    }
    Test();
  ?>

这样的话,我们就相当于得到了对全局变量$name的一个引用,而不需要重新创建一个$name变量了。

在PHP手册中有这样一句话:使用全局变量等效于在$GLOBALS变量中创建一个对变量的引用。那么我们就可以模仿这个语义写出这样的代码:

<?php 
    $name="kym";
    function Test()
    {
      $temp=&$GLOBALS["name"];
      echo($temp);
    }
    Test();
  ?>

其实这两种是等效的代码。看上去这样使用变量很麻烦,但是这样其实避免了很多副作用的产生,如Java,C#是面向对象的语言,但是在PHP中,一切都在一个页面,甚至多个页面中,那么如果不使用这样的办法,很容易产生函数的副作用(误修改)。

2. 默认参数

第一次听过这个概念应该是在C++中,之后学了C#,就没有接触过这个概念了,不过个人还是非常喜欢这个特性的。

这样就可以不必要为一个函数写一堆麻烦的重载函数了。

写个最简单的例子:

<?php 
    function Test($name="kym")
    {
      echo($name);
    }
    Test();
    Test("others");
  ?>

 

是不是不需要写一个重载函数了呢?

但是在这里需要注意两点:

A. 在为参数设置默认值时,只能设置最简单的常量,而不能包含复杂的表达式。

B. 需要设置默认值的参数必须放在最后。这个类似于C#中的可变参数。

3. 可变参数

在C#中,就存在这样一个概念叫可变参数,写个简单的例子:

protected void LinkButton1_Click(object sender, EventArgs e)
{
  Response.Write(GetSum(1, 2, 3, 4, 5));
}
public int GetSum(params int[] elements)
{
  int sum = 0;
  for (int i = 0; i < elements.Length; i++)
  {
    sum += elements[i];
  }
  return sum;
}

在写例子之前,我先来介绍三个与可变参数相关的函数。

func_get_args()返回函数的所有参数的数组

func_get_arg()返回一个来自参数的特定参数

func_num_args()返回参数的个数。

好,那么接下来就写一个和C#版本对应的PHP版本。

<?php 
    function GetSum()
    {
      if(func_num_args()==0)
      {
        return 0;
      }
      $sum=0;
      for($i=0;$i<func_num_args();$i++)
      {
        $sum+=func_get_arg($i);
      }
      return $sum;  
    }
    echo(GetSum(1,2,3,4));
  ?>

4. 可变函数

我不知道为什么要翻译成这个名字,其实就是根据变量的名字来调用相应的函数。

很类似于JS中的这个eval,如下所示:

<script>
  function Execute(functionName)
  {
    eval(functionName+"()");
  }
  function Test()
  {
    alert("111");
  }
  Execute("Test");
</script>

这个就是传进来一个函数名,然后来执行对应的函数。那么在PHP中,其实也是一样的,而且更简单了。

<?php 
  function Test($func)
  {
    $func();
  }
  function First(){echo("first");}
  Test("First");
?>
PHP 相关文章推荐
推荐php模板技术[转]
Jan 04 PHP
mac下使用brew配置环境的步骤分享
May 23 PHP
rephactor 优秀的PHP的重构工具
Jun 09 PHP
如何使用FireFox插件FirePHP调试PHP
Jul 23 PHP
php中并发读写文件冲突的解决方案
Oct 25 PHP
php查找任何页面上的所有链接的方法
Dec 03 PHP
PHP empty函数报错解决办法
Mar 06 PHP
php显示指定目录下子目录的方法
Mar 20 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Dec 14 PHP
PHP实现非阻塞模式的方法分析
Jul 26 PHP
PHP 文件写入和读取操作实例详解【必看篇】
Nov 04 PHP
PHP 构造函数和析构函数原理与用法分析
Apr 21 PHP
一步一步学习PHP(3) php 函数
Feb 15 #PHP
一步一步学习PHP(2)――PHP类型
Feb 15 #PHP
一步一步学习PHP(1) php开发环境配置
Feb 15 #PHP
PHP生成网页快照 不用COM不用扩展.
Feb 11 #PHP
检查url链接是否已经有参数的php代码 添加 ? 或 &amp;
Feb 09 #PHP
php 自写函数代码 获取关键字 去超链接
Feb 08 #PHP
PHP 手机归属地查询 api
Feb 08 #PHP
You might like
PHP中的正规表达式(二)
2006/10/09 PHP
PHP异常处理浅析
2015/05/12 PHP
详解php协程知识点
2018/09/21 PHP
JQUERY 对象与DOM对象之两者相互间的转换
2009/04/27 Javascript
jquery autocomplete自动完成插件的的使用方法
2010/08/07 Javascript
基于jquery的loading效果实现代码
2010/11/05 Javascript
javascript之典型高阶函数应用介绍
2013/01/10 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
vue实现图片加载完成前的loading组件方法
2018/02/05 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
2019/10/31 Javascript
解决Vue在Tomcat8下部署页面不加载的问题
2019/11/12 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
JS数组方法reduce的用法实例分析
2020/03/03 Javascript
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
Python Web开发模板引擎优缺点总结
2014/05/06 Python
Python中字符串的处理技巧分享
2016/09/17 Python
Django实现的自定义访问日志模块示例
2017/06/23 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
python如何写try语句
2020/07/14 Python
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
《一个中国孩子的呼声》教学反思
2014/02/12 职场文书
家长学校教学计划
2015/01/19 职场文书
JS + HTML 罗盘式时钟的实现
2021/05/21 Javascript
嵌入式Redis服务器在Spring Boot测试中的使用教程
2021/07/21 Redis
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js
SQL SERVER存储过程用法详解
2022/02/24 SQL Server
前端实现滑动按钮AJAX与后端交互的示例代码
2022/02/24 Javascript