相信每个人在学习PHP之前至少都有着一定的C语言,或者是C++/Java/C#等其他语言的基础,所以在这里也不从头开始说起,只是来谈谈PHP方法的独特之处。

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(4)——函数的更多相关文章

  1. 12.Linux软件安装 (一步一步学习大数据系列之 Linux)

    1.如何上传安装包到服务器 有三种方式: 1.1使用图形化工具,如: filezilla 如何使用FileZilla上传和下载文件 1.2使用 sftp 工具: 在 windows下使用CRT 软件 ...

  2. (转) 一步一步学习ASP.NET 5 (四)- ASP.NET MVC 6四大特性

    转发:微软MVP 卢建晖 的文章,希望对大家有帮助.原文:http://blog.csdn.net/kinfey/article/details/44459625 编者语 : 昨晚写好的文章居然csd ...

  3. (转) 一步一步学习ASP.NET 5 (二)- 通过命令行和sublime创建项目

    转发:微软MVP 卢建晖 的文章,希望对大家有帮助. 注:昨天转发之后很多朋友指出了vNext的命名问题,原文作者已经做出了修改,后面的标题都适用 asp.net 5这个名称. 编者语 : 昨天发了第 ...

  4. 一步一步学习SignalR进行实时通信_1_简单介绍

    一步一步学习SignalR进行实时通信\_1_简单介绍 SignalR 一步一步学习SignalR进行实时通信_1_简单介绍 前言 SignalR介绍 支持的平台 相关说明 OWIN 结束语 参考文献 ...

  5. 一步一步学习SignalR进行实时通信_8_案例2

    原文:一步一步学习SignalR进行实时通信_8_案例2 一步一步学习SignalR进行实时通信\_8_案例2 SignalR 一步一步学习SignalR进行实时通信_8_案例2 前言 配置Hub 建 ...

  6. 一步一步学习SignalR进行实时通信_9_托管在非Web应用程序

    原文:一步一步学习SignalR进行实时通信_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信\_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信_9_托管在非We ...

  7. 一步一步学习SignalR进行实时通信_7_非代理

    原文:一步一步学习SignalR进行实时通信_7_非代理 一步一步学习SignalR进行实时通信\_7_非代理 SignalR 一步一步学习SignalR进行实时通信_7_非代理 前言 代理与非代理 ...

  8. 一步一步学习SignalR进行实时通信_5_Hub

    原文:一步一步学习SignalR进行实时通信_5_Hub 一步一步学习SignalR进行实时通信\_5_Hub SignalR 一步一步学习SignalR进行实时通信_5_Hub 前言 Hub命名规则 ...

  9. 一步一步学习SignalR进行实时通信_6_案例

    原文:一步一步学习SignalR进行实时通信_6_案例 一步一步学习SignalR进行实时通信\_6_案例1 一步一步学习SignalR进行实时通信_6_案例1 前言 类的定义 各块功能 后台 上线 ...

  10. 一步一步学习SignalR进行实时通信_4_Hub

    原文:一步一步学习SignalR进行实时通信_4_Hub 一步一步学习SignalR进行实时通信\_4_Hub SignalR 一步一步学习SignalR进行实时通信_4_Hub 前言 创建Hub 配 ...

随机推荐

  1. 【译】UI设计基础(UI Design Basics)--为iOS设计(Design for iOS)(二)

    2.1 为iOS设计(Design for iOS) iOS体现以下主题: 遵从:UI帮助用户理解界面内容并与内容交互,但绝不会与内容相互冲突. 清晰:文本在任何尺寸下都是清晰易读,图标精确易懂,装饰 ...

  2. Oracle开始从Java运行时中移除JAR包

    早在2012年8月,在Java平台首席架构师Mark Reinhold宣布模块化项目Jigsaw之后不久,JEP 162这一题为“准备模块化”的提案就指出,在Jigsaw项目中为模块化系统开发的代码不 ...

  3. Replicate String in C#

    My original posting on string repetition caused a couple responses, and is currently among the Top P ...

  4. CodeForce 2A Winner

    很多人玩一个游戏,每一轮有一个人得分或者扣分,最后分数最高的人夺冠:如果最后有多个人分数都是最高的,则这些人里面,在比赛过程中首先达到或者超过这个分数的人夺冠.现在给定最多1000轮每轮的情况,求最后 ...

  5. (转载)PHP去掉转义后字符串中的反斜杠\函数stripslashes

    (转载)http://www.beijibear.com/index.php?aid=182 addslashes()函数主要是在字符串中添加反斜杠对特殊字符进行转义,stripslashes()则是 ...

  6. HDU 5875 Function 【倍增】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  7. 汇编学习笔记(7)call和ret指令

    ret和retf CPU执行ret指令时进行以下两步操作: (IP)=((ss)*16+(sp)) (sp)=(sp)+2 这相当于pop IP CPU执行retf指令时进行以下四步操作: (IP)= ...

  8. Swing实现文件选择(目录选择)附导出

    具体生成工具如图: (1) (2) (3) (4) 源码 : example.java package org.qiailin.jframe; import java.awt.Container; i ...

  9. 10个经典的Java面试题

    这里有10个经典的Java面试题,也为大家列出了答案.这是Java开发人员面试经常容易遇到的问题,相信你了解和掌握之后一定会有所提高.让我们一起来看看吧. 1.Java的HashMap是如何工作的? ...

  10. flume-ng 使用spool source 传输文件到hdfs

    Flume 1.4.0 User Guide 地址:http://archive.cloudera.com/cdh4/cdh/4/flume-ng-1.4.0-cdh4.6.0/FlumeUserGu ...