一步一步学习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函数解决SQL injection
Oct 09 PHP
PHP容易忘记的知识点分享
Apr 30 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
Jun 25 PHP
php实现监听事件
Nov 06 PHP
js和php邮箱地址验证的实现方法
Jan 09 PHP
php利用cookies实现购物车的方法
Dec 10 PHP
四种php中webservice实现的简单架构方法及实例
Feb 03 PHP
php中有关合并某一字段键值相同的数组合并的改进
Mar 10 PHP
php计算一个文件大小的方法
Mar 30 PHP
详解yii2实现分库分表的方案与思路
Feb 03 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
Aug 30 PHP
laravel 执行迁移回滚示例
Oct 23 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实现的遍历文件夹下所有文件,编辑删除
2010/01/05 PHP
PHP Cookie的使用教程详解
2013/06/03 PHP
windows7下php开发环境搭建图文教程
2015/01/06 PHP
PHP使用in_array函数检查数组中是否存在某个值
2015/03/25 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
input 高级限制级用法
2009/03/26 Javascript
ECMAScript 创建自己的js类库
2012/11/22 Javascript
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
2013/10/23 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
2013/12/06 Javascript
javascript批量修改文件编码格式的方法
2015/01/27 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
JavaScript知识点总结(四)之逻辑OR运算符详解
2016/05/31 Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
2016/09/01 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
python 自动提交和抓取网页
2009/07/13 Python
详解python实现识别手写MNIST数字集的程序
2018/08/03 Python
python线程的几种创建方式详解
2019/08/29 Python
Python实现打印实心和空心菱形
2019/11/23 Python
python实现门限回归方式
2020/02/29 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
荷兰本土平价百货:HEMA
2017/10/23 全球购物
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
出生医学证明样本
2014/01/17 职场文书
意向书范文
2014/03/31 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
2014年客服工作总结范文
2014/11/13 职场文书
vue+spring boot实现校验码功能
2021/05/27 Vue.js
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js