Maison > développement back-end > tutoriel php > 一步一步学习PHP(4) php 函数 补充2_PHP教程

一步一步学习PHP(4) php 函数 补充2_PHP教程

WBOY
Libérer: 2016-07-21 15:40:48
original
864 Les gens l'ont consulté

1. 解决作用域问题

在上一节谈到了PHP中函数的作用域问题,如果说类还不够说明问题,那么在这篇文章中的作用域例子,也许对您更有说服力。

那么,我们如何能在PHP的函数中访问外部的变量呢?

在PHP中,存在一个概念叫做全局作用域,也就是说,如果你不使用函数(未来会有类的概念),那么你创建的变量可以在页面的任何地方访问。那么,我们怎么解决函数体内的问题呢?

我们可以使用global关键字:

  <span style="COLOR: blue"></span><span style="COLOR: maroon">php 
    </span>$<span style="COLOR: red">name</span><span style="COLOR: blue">="kym"</span>;
    <span style="COLOR: red">function Test</span>()
    {
      <span style="COLOR: red">global </span>$<span style="COLOR: red">name</span>;
      <span style="COLOR: red">echo</span>($<span style="COLOR: red">name</span>);
    }
    <span style="COLOR: red">Test</span>();
  <span style="COLOR: blue">?>
</span>
Copier après la connexion

这样的话,我们就相当于得到了对全局变量$name的一个引用,而不需要重新创建一个$name变量了。

在PHP手册中有这样一句话:使用全局变量等效于在$GLOBALS变量中创建一个对变量的引用。那么我们就可以模仿这个语义写出这样的代码:

  <span style="COLOR: blue"></span><span style="COLOR: maroon">php 
    </span>$<span style="COLOR: red">name</span><span style="COLOR: blue">="kym"</span>;
    <span style="COLOR: red">function Test</span>()
    {
      $<span style="COLOR: red">temp</span><span style="COLOR: blue">=&$GLOBALS["</span><span style="COLOR: red">name</span><span style="COLOR: blue">"];
      echo($temp);
    }
    Test();
  ?>
</span>
Copier après la connexion

其实这两种是等效的代码。看上去这样使用变量很麻烦,但是这样其实避免了很多副作用的产生,如Java,C#是面向对象的语言,但是在PHP中,一切都在一个页面,甚至多个页面中,那么如果不使用这样的办法,很容易产生函数的副作用(误修改)。

2. 默认参数

第一次听过这个概念应该是在C++中,之后学了C#,就没有接触过这个概念了,不过个人还是非常喜欢这个特性的。

这样就可以不必要为一个函数写一堆麻烦的重载函数了。

写个最简单的例子:

  <span style="COLOR: blue"></span><span style="COLOR: maroon">php 
    </span><span style="COLOR: red">function Test</span>($<span style="COLOR: red">name</span><span style="COLOR: blue">="kym"</span>)
    {
      <span style="COLOR: red">echo</span>($<span style="COLOR: red">name</span>);
    }
    <span style="COLOR: red">Test</span>();
    <span style="COLOR: red">Test</span>(<span style="COLOR: blue">"others"</span>);
  <span style="COLOR: blue">?>
</span>
Copier après la connexion

 

是不是不需要写一个重载函数了呢?

但是在这里需要注意两点:

A. 在为参数设置默认值时,只能设置最简单的常量,而不能包含复杂的表达式。

B. 需要设置默认值的参数必须放在最后。这个类似于C#中的可变参数。

3. 可变参数

在C#中,就存在这样一个概念叫可变参数,写个简单的例子:

<span style="COLOR: blue">protected void </span>LinkButton1_Click(<span style="COLOR: blue">object </span>sender, <span style="COLOR: #2b91af">EventArgs </span>e)
{
  Response.Write(GetSum(1, 2, 3, 4, 5));
}
<span style="COLOR: blue">public int </span>GetSum(<span style="COLOR: blue">params int</span>[] elements)
{
  <span style="COLOR: blue">int </span>sum = 0;
  <span style="COLOR: blue">for </span>(<span style="COLOR: blue">int </span>i = 0; i return sum;
}
Copier après la connexion

在写例子之前,我先来介绍三个与可变参数相关的函数。

func_get_args()返回函数的所有参数的数组

func_get_arg()返回一个来自参数的特定参数

func_num_args()返回参数的个数。

好,那么接下来就写一个和C#版本对应的PHP版本。

  <span style="COLOR: blue"></span><span style="COLOR: maroon">php 
    </span><span style="COLOR: red">function GetSum</span>()
    {
      <span style="COLOR: red">if</span>(<span style="COLOR: red">func_num_args</span>()<span style="COLOR: blue">=</span>=0)
      {
        <span style="COLOR: red">return </span>0;
      }
      $<span style="COLOR: red">sum</span><span style="COLOR: blue">=0;
      </span><span style="COLOR: red">for</span>($<span style="COLOR: red">i</span><span style="COLOR: blue">=0;$i<span style="COLOR: maroon">func_num_args</span>();$<span style="COLOR: red">i</span>++)
      {
        $<span style="COLOR: red">sum</span>+<span style="COLOR: blue">=func_get_arg($i);
      </span>}
      <span style="COLOR: red">return </span>$<span style="COLOR: red">sum</span>;  
    }
    <span style="COLOR: red">echo</span>(<span style="COLOR: red">GetSum</span>(1,2,3,4));
  ?<span style="COLOR: blue">>
</span></span>
Copier après la connexion

4. 可变函数

我不知道为什么要翻译成这个名字,其实就是根据变量的名字来调用相应的函数。

很类似于JS中的这个eval,如下所示:

<span style="COLOR: teal"><span style="COLOR: #3f7f7f">script</span><span style="COLOR: teal">>
  </span><span style="COLOR: #7f0055">function </span>Execute(functionName)
  {
    eval(functionName+<span style="COLOR: #2a00ff">"()"</span>);
  }
  <span style="COLOR: #7f0055">function </span>Test()
  {
    alert(<span style="COLOR: #2a00ff">"111"</span>);
  }
  Execute(<span style="COLOR: #2a00ff">"Test"</span>);
<span style="COLOR: teal"></span><span style="COLOR: #3f7f7f">script</span><span style="COLOR: teal">></span></span>
Copier après la connexion

这个就是传进来一个函数名,然后来执行对应的函数。那么在PHP中,其实也是一样的,而且更简单了。

<span style="COLOR: red"><?php </SPAN><span style="COLOR: blue">function </span>Test(<span style="COLOR: #660000">$func</span>)
  {
    <span style="COLOR: #660000">$func</span>();
  }
  <span style="COLOR: blue">function </span>First(){<span style="COLOR: blue">echo</span>(<span style="COLOR: #008200">"first"</span>);}
  Test(<span style="COLOR: #008200">"First"</span>);
<span style="COLOR: red">?></span></span>
Copier après la connexion

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/321306.htmlTechArticle1. 解决作用域问题 在上一节谈到了PHP中函数的作用域问题,如果说类还不够说明问题,那么在这篇文章中的作用域例子,也许对您更有说服...
Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal