PHP -- 函数基础入门
FROM : http://www.cnblogs.com/kym/archive/2010/02/14/1668300.html,
http://www.cnblogs.com/kym/archive/2010/02/15/1668335.html
本文目录:
- 简单的PHP函数示例
- 参数的引用传递和值传递
- 作用域的问题(全局变量)
- 默认参数和可变参数
- 可变函数
简单的PHP函数示例:
<html>
<head>
<title>HelloPHP</title>
</head>
<body>
<?php
function CustomPrint($str)
{
for($i=0;$i<5;$i++)
{
echo($str);
echo('<br/>');
}
} CustomPrint("Hello");
?>
</body>
</html>
总结一下,这个方法的要点:
A. PHP的方法用function来声明,这一点类似于我们熟悉的Javascript.
B. 在使用变量必须要以美元符($)来开头。
参数的引用传递和值传递
参数的值传递和引用传递,相信每个人在学习C语言时都接触到了,在此用C#来写例子:
public void Swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
public void Swap(ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}
修改成php代码,
<?php
function Swap1($a,$b)
{
$temp=$a;
$a=$b;
$b=$temp;
}
function Swap2(&$a,&$b)
{
$temp=$a;
$a=$b;
$b=$temp;
} function CustomPrint($str)
{
echo($str);
echo("<br/>");
} $a=1;
$b=2;
Swap1($a,$b);
CustomPrint("值传递的结果:");
CustomPrint('$a='.$a);
CustomPrint('$b='.$b);
$a=1;
$b=2;
Swap2($a,$b);
CustomPrint("引用传递的结果:");
CustomPrint('$a='.$a);
CustomPrint('$b='.$b);
?>
上面例子有两点要注意:
A. 值传递和引用传递的区别在于在参数前的“&”.
B. CustomPrint('$a='.$a);在这句中,需要特殊说明一下单引号和双引号的区别,他们之间只有一个区别,就是能否解析变量名。
对于注意点B,说明例子如下:
<?php
$a=1;
echo("$a");
echo("<br/>");
echo('$a');
?>
输出:
1
$a
提示:
关于性能的问题,在按值传递时,PHP需要进行复制,然后再传递,这样如果那些大对象或者字符串的话,就会不仅仅耗费时间,而且对空间也是一种浪费。这时,如果进行引用传递,就免去了耗费性能的复制操作。对性能提高很有好处。
作用域的问题
在C#中,由于变量在使用之前必须声明,因此会涉及到一个作用域和子作用域的概念,而在PHP中则没有这样的概念。
我们来看一段C#代码:
public class Student
{
private string name;
public void SayHello()
{
HttpContext.Current.Response.Write("Hello,I am " + name);
}
}
也就是说,在方法内可以访问外部类声明的变量,但是在PHP中则不一样:
注:函数“isset”,这个函数可以检测一个变量是否被定义,或者是否是空字符串。
<?php
$name="kym";
function SayHello()
{
if(isset($name))
{
echo("Hello $name");
}
else
{
echo('$name is undefined');
}
}
SayHello();
?>
输出: $name is undefine
这个结果说明,在函数体内,无法访问到外部变量$name。
附:一个与unset对应的函数:unset。该函数用于移除一个变量的值。
<?php
$name="kym";
if(isset($name))
{
echo("Yes");
}
else
{
echo("No");
}
unset($name);
if(isset($name))
{
echo("Yes");
}
else
{
echo("No");
}
?>
输出:YesNo
解决作用域问题
如何能在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中,一切都在一个页面,甚至多个页面中,那么如果不使用这样的办法,很容易产生函数的副作用(误修改)。
默认参数和可变参数
1. 默认参数
这样就可以不必要为一个函数写一堆麻烦的重载函数了。
写个最简单的例子:
<?php
function Test($name="kym")
{
echo($name);
}
Test();
Test("others");
?>
是不是不需要写一个重载函数了呢?
但是在这里需要注意两点:
A. 在为参数设置默认值时,只能设置最简单的常量,而不能包含复杂的表达式。
B. 需要设置默认值的参数必须放在最后。这个类似于C#中的可变参数。
2. 可变参数
在C#中,就存在这样一个概念叫可变参数,写个简单的例子:
protected void LinkButton1_Click(object sender, EventArgs e)
{
Response.Write(GetSum(, , , , ));
}
public int GetSum(params int[] elements)
{
int sum = ;
for (int i = ; 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));
?>
可变函数 (根据变量的名字来调用相应的函数)
很类似于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 -- 函数基础入门的更多相关文章
- Scala 函数基础入门
函数的定义与调用 在Scala中定义函数时,需要定义函数的函数名.参数.函数体. 我们的第一个函数如下所示: def sayHello(name: String, age: Int) = { if ( ...
- 函数:我的地盘听我的 - 零基础入门学习Python019
函数:我的地盘听我的 让编程改变世界 Change the world by program 函数与过程 在小甲鱼另一个实践性超强的编程视频教学<零基础入门学习Delphi>中,我们谈到了 ...
- Swift语法基础入门三(函数, 闭包)
Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: ...
- PHP基础入门(三)---PHP函数基础
PHP基础入门(三)---函数 今天来给大家分享一下PHP的函数基础.有了前两章的了解,想必大家对PHP有了一定的基础了解.想回顾前两章的朋友可以点击"PHP基础入门(一)"&qu ...
- PHP基础入门(二)【PHP函数基础】
PHP基础入门(二)--函数基础 了解 PHP基础入门详解(一) 后,给大家分享一下PHP的函数基础. 这部分主要讲的就是: 函数的声明与使用.PHP中变量的作用域.静态变量.函数的参数传递.变量函数 ...
- PHP丨PHP基础知识之PHP基础入门——函数「理论篇」
前两天讲过PHP基础知识的判断条件和流程控制,今天来讲讲PHP基础知识之PHP基础入门--函数! 一.函数的声明与使用 1.函数名是标识符之一,只能有数字字母下划线,开头不能是数字. 函数名的命名,须 ...
- 09-Python入门学习-函数基础与参数
一.函数基础 1.定义函数的三种形式 1.1 无参函数 def foo(): print('from foo') foo() 1.2 有参函数 def bar(x,y): print(x,y) bar ...
- 《挑战30天C++入门极限》C++运算符重载函数基础及其值返回状态
C++运算符重载函数基础及其值返回状态 运算符重载是C++的重要组成部分,它可以让程序更加的简单易懂,简单的运算符使用可以使复杂函数的理解更直观. 对于普通对象来说我们很自然的会频繁使用算数运 ...
- Shell编程菜鸟基础入门笔记
Shell编程基础入门 1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...
随机推荐
- Linux下文件目录权限和对应命令的总结
Linux下的权限有rwx三种,分别对应读,写,执行三种,在对文件和目录时,分别是下列含义: 对应权限的命令为: 文件: r-- cat, more, head, tail w-- echo, vi ...
- Linux 查看网卡流量【转】
我的系统式RHEL5. 在linux下,查看网卡流量的方法有很多.下面先记录几个,和他们的大概用法.已被以后之需. 一:iptraf 一个很不错的工具.RHEL5 iso自带有,我 ...
- git 还原到指定版本号
git clone git branch -r --contains 88b92060224e96ef209565fa75c816eb9b0fae8e git checkout origin/re ...
- loadrunner 测试问题汇总
1.关于Error -27791: Error -27790:Error -27740: 错误如下: Action.c(198): Error -27791: Server ...
- 防范XSS跨站2
原文:http://blog.csdn.net/joeyon1985/article/details/43527987 在前面的一篇文章中,讲到了java web应用程序防止 csrf 攻击的方法,参 ...
- [置顶]
人工智能(深度学习)加速芯片论文阅读笔记 (已添加ISSCC17,FPGA17...ISCA17...)
这是一个导读,可以快速找到我记录的关于人工智能(深度学习)加速芯片论文阅读笔记. ISSCC 2017 Session14 Deep Learning Processors: ISSCC 2017关于 ...
- gentoo emerge unable to sync
gentoo emerge unable to sync Author: Tubo After setting SYNC to customized URL: SYNC="rsync://m ...
- gtk+学习笔记(三)
gtk感觉函数好多,需要记好多函数,还是多练习,多总结,今天写了一个登陆窗口,很简单,主要是为了加深对这些东西的记忆,直接贴代码 #include<gtk/gtk.h> static Gt ...
- 秀尔算法:破解RSA加密的“不灭神话” --zz
http://netsecurity.51cto.com/art/201508/488766.htm RSA加密曾被视为最可靠的加密算法,直到秀尔算法出现,打破了RSA的不灭神话. RSA加密 VS ...
- [BZOJ4942][Noi2017]整数 线段树+压位
用线段树来模拟加减法过程,维护连续一段中是否全为0/1. 因为数字很大,我们60位压一位来处理. #include<iostream> #include<cstring> #i ...