Maison  >  Article  >  développement back-end  >  A quoi sert la fonction de rappel php ?

A quoi sert la fonction de rappel php ?

怪我咯
怪我咯original
2017-06-19 11:19:465266parcourir

Il est plus facile de le comprendre comme une variable, comme $a=function(){echo "aaa";};$aa(); ou function a(){}; $b ="a"; $b(); L'une est la fonction anonyme à appeler en tant que variable, et l'autre est le nom de la fonction à appeler en tant que variable. de fonction de rappel, simple Par exemple, cette façon d'appeler des fonctions est appelée fonction de rappel

fonction de rappel rappel

Nous savons tous que lorsque les requêtes asynchrones sont souvent traité dans js, si des fonctions ordinaires sont utilisées, il peut ne pas être garanti qu'il soit appelé une fois la requête asynchrone terminée. Il existe donc une fonction de rappel, notamment lors du traitement de fichiers et du traitement ajax, la fonction de rappel est très utile.
Fonction call_user_func()
mixed call_user_func ( callable $callback [, Mixed $parameter [, Mixed $… ]] )

return renvoie une valeur de type composite, qui est en fait renvoyée par la fonction de rappel Value

callable $callback La fonction de rappel peut être un nom de fonction, un tableau ou une chaîne

mixte $parameter Paramètres de la fonction, affichés en séquence

Ce qui suit est une introduction à l'utilisation de la démo
demo1 : rappel de la forme de chaîne de fonction php

<?php
$data = array("name"=>"callback" , "value"=>"test");
$rs1 = http_build_query($data);      //直接调用php函数
$rs2  = call_user_func("http_build_query",$data); //使用回调函数
echo $rs1;  //name=callback&value=test
echo "<br />";
echo $rs2;  //name=callback&value=test
// 这里需要注意的是,参数1必须是可使用的函数可以通过function_exists()返回true的函数,这里提醒isset,empty,is_null 等认为的常用函数实际上是一个操作符.并不能算函数。

demo2 rappel de la fonction php nom de la fonction forme de variable

<?php
//自定义函数
function myUrldecode($str){
    return urldecode($str);
}
$data = array("name"=>"callback" , "value"=>"天才");
$str  = http_build_query($data); 
$rs1  = urldecode($str);      //urlencode编码
$rs2  = call_user_func(myUrldecode,$str);
echo $rs1;  //name=callback&value=天才
echo "<br />";
echo $rs2;  //name=callback&value=天才
//这里我们可以看到,我们直接使用函数的名称也是可以的,不需要带引号字符串。
?>

demo3 rappel Format de tableau de méthode de classe

<?php 
class MyClass{
    private $demo = "test";

    function myUrldecode($str){
        return urldecode($str);
    }
    static  function myUrlencode($str){
        return urlencode($str) ;
    }
}
$str = "?query=/test/demo1";

$encode  = call_user_func(array(MyClass,"myUrlencode"),$str);
//直接使用类的静态方法 将字符串进行url编码 不再是字符串或者函数名,而是一个数组格式,第一个项表示类名,第二个项则表示方法名。 第一项可以为类的引用地址,第二项为静态方法名称
$decode  = call_user_func(array("MyClass","myUrlencode"),$encode);
//同样是使用类的方法,不过调用的是普通方法名称。
echo $encode;  //%3Fquery%3D%2Ftest%2Fdemo1
echo "<br />"; //?query=/test/demo1
echo $decode;
//注意 使用方法名也具有作用域的概念,即private protected 和 public,通常回调类方法都只能调用publi 和默认作用域的 方法。
//同时如果是普通方法,并且内部使用了$this变量,那么进行调用是无法成功的.

?>

demo4 Format de chaîne de méthode de classe de rappel

<?php
class MyClass{
    private $demo = "test";

    function myUrldecode($str){
        return urldecode($str);
    }

    private function myUrldecode2($str){
    return urldecode($str);
    }
    static  function myUrlencode($str){
        return urlencode($str) ;
    }
}

$str = "?query=/test/demo1";
  $encode  = call_user_func("MyClass::myUrlencode",$str);
  $decode  = call_user_func("MyClass::myUrldecode",$encode);
  echo $encode; //  %3Fquery%3D%2Ftest%2Fdemo1
  echo "<br />";
  echo $decode; //  ?query=/test/demo1
  $encode2  = call_user_func("MyClass::myUrlencode2",$str);
  var_dump($encode2);  // null
//如果直接使用字符串的方法的话,那么必须在类和方法名中添加::作为分割。
//这里我们发现不是静态方法也可以用::进行调用
//这里进行了一个测试,发现调用private 作用域的方法返回的是一个null值,说明确实存在作用域的关系
?>

demo5 Format de tableau de méthode d'objet de rappel

<?php
class MyClass{
    private $demo = "test";


    function myUrldecode($str){
        return urldecode($str)  ."-" .$this->demo ; //调用内部的this作用域
    }
    static  function myUrlencode($str){
        return urlencode($str);
    }
}

 $str = "?query=/test/demo1";
 $class =  new MyClass();
 $encode  = call_user_func(array($class,"myUrlencode"),$str);
 $decode  = call_user_func(array($class,"myUrldecode"),$str);
 echo $encode; //%3Fquery%3D%2Ftest%2Fdemo1
 echo "<br />";
 echo $decode; //?query=/test/demo1-test
 //很明显,如果使用对象做为回调函数,内部的private 属性和方法也可以使用,但是对外的方法必须为默认或者 public类型
 //对象数组方式第一个选项必须为一个对象
?>

Parfois, nous constatons que le passé Le Les paramètres peuvent ne pas être corrigés, donc l'utilisation de call_user_func() causera des problèmes. Pour le moment, vous pouvez utiliser la méthode call_user_func_array(). La plupart des méthodes d'utilisation sont les mêmes, mais l'utilisation des paramètres sera légèrement différente. >Fonction call_user_func_array()

demo1 Fonction de rappel PHP avec paramètres variables

<?php 
   $record1 = array(
            &#39;id&#39; => 2135,
    );
    $record2 = array(
        &#39;first_name&#39; => &#39;Sally&#39;,
    );
    $record3 = array(
        &#39;last_name&#39; => &#39;Jones&#39;,
    );
$return  = array_merge($record1,$record2,$record3);
//如果使用回调函数,则如下
$return  = call_user_func_array("array_merge", array($record1,$record2,$record3));
print_r($return); //Array ( [id] => 2135 [first_name] => Sally [last_name] => Jones )
//一些特别的函数允许你有不固定的参数,如果你还将它作为回调函数,则可以使用这个方法进行调用.
?>
tips1 Comment déterminer s'il s'agit d'une fonction de rappel

bool is_callable ( callable $name [, bool $ syntax_only = false [, string &$callable_name ]] )

name

La fonction de rappel à vérifier.
syntax_only
Si elle est définie sur TRUE, cette fonction vérifie uniquement que le nom peut être une fonction ou une méthode.
callable_name
Accepte le "nom appelable".
return
Si le nom est appelable, renvoie TRUE, sinon renvoie FALSE

<?php
// is_callable(); 
$bool = is_callable(urlencode);  // true
$bool = is_callable(urlencode,false);  // true
$bool = is_callable(urlencode,true);  // true
$bool = is_callable("urlencode",false,$callable_name1);
// string urlencode
$bool = is_callable("urldecode",true,$callable_name2); 
// string urldecode 即使不存在回调函数也会返回true
?>
tips2 Obtenez les paramètres de la fonction, similaires aux arguments

en js

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
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