zoukankan      html  css  js  c++  java
  • 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");
    ?>
  • 相关阅读:
    js中通过Object.prototype.toString方法----精确判断对象的类型
    leecode---dfs,array,局部和全局---152. Maximum Product Subarray
    leecode96---dfs,dp,tree---96. Unique Binary Search Trees
    leecode115---dfs,string---Distinct Subsequences
    JVM:G1垃圾回收器
    java基础---JVM---CMS垃圾回收器
    java基础---JVM---调优,垃圾收集器,内存分配策略
    java基础---JVM---java内存区域与内存溢出问题
    java基础---一致性hash算法
    java基础---多态的实现原理
  • 原文地址:https://www.cnblogs.com/lmei/p/3352274.html
Copyright © 2011-2022 走看看