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(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));
    ?>

 

     可变函数       根据变量的名字来调用相应的函数) 

很类似于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");
?>
posted @ 2013-10-05 12:13  lmei  阅读(284)  评论(0编辑  收藏  举报