Maison >développement back-end >tutoriel php >Explication détaillée de la façon d'implémenter des exemples de surcharge de fonctions et de constructeurs en PHP

Explication détaillée de la façon d'implémenter des exemples de surcharge de fonctions et de constructeurs en PHP

伊谢尔伦
伊谢尔伦original
2017-07-08 09:40:301663parcourir

Puisque PHP est un langage faiblement typé, le type de paramètre d'entrée de la fonction ne peut pas être déterminé (des indices de type peuvent être utilisés, mais les indices de type ne peuvent pas être utilisés pour des types tels que des entiers, chaînes et autres types scalaires), et pour une fonction, par exemple, seuls 3 paramètres d'entrée sont définis, mais PHP saisit 4 paramètres ou plus lors de l'exécution de l'appel. Par conséquent, sur la base de ces deux points, il est prévu que les fonctions ne puissent pas être surchargées en PHP (similaire aux langages Javascript), ni qu'il ne puisse y avoir de constructeurs de surcharge.

Étant donné que l'implémentation de la surcharge de fonctions est très utile pour améliorer l'efficacité du développement, ce serait formidable si cela pouvait être fait comme C# ou C++. En fait, PHP fournit une méthode magique, appel mixte (nom de chaîne, arguments du tableau). Cette méthode est également mentionnée dans le manuel php Selon la documentation officielle, il est dit que cette méthode peut réaliser une surcharge de fonctions. Lors de l'appel d'une méthode qui n'existe pas dans l'objet, si la méthode call() est définie, la méthode sera appelée. Par exemple, le code suivant :

<?php
class A
{
   function call ( $name, $arguments )
    {
        echo "call调用<br/>";
        echo &#39;$name为&#39;.$name."<br/>";
        print_r ($arguments);
    }
}
(new A)->test("test","argument");
?>

Le résultat en cours d'exécution est :

call call

$name is test

Array ( [0] => test [1] => argument )

Il vous suffit donc d'utiliser cette méthode magique pour implémenter la surcharge de fonctions.

Le code est le suivant :

<?php
class A
{
     function call ($name, $args )
    {
        if($name==&#39;f&#39;)
        {
            $i=count($args);
            if (method_exists($this,$f=&#39;f&#39;.$i)) {
                call_user_func_array(array($this,$f),$args);
            }
        }
    }
    function f1($a1)
    {
        echo "1个参数".$a1."<br/>";
    }
    function f2($a1,$a2)
    {
        echo "2个参数".$a1.",".$a2."<br/>";
    }
    function f3($a1,$a2,$a3)
    {
          echo "3个参数".$a1.",".$a2.",".$a3."<br/>";
    }
}
(new A)->f(&#39;a&#39;);
(new A)->f(&#39;a&#39;,&#39;b&#39;);
(new A)->f(&#39;a&#39;,&#39;b&#39;,&#39;c&#39;);
输出如下:
1个参数a   2个参数a,b    3个参数a,b,c

De même, en PHP, la surcharge des constructeurs ne peut être implémentée que de manière flexible. L'élément clé de l'implémentation consiste à obtenir les paramètres d'entrée et à déterminer la méthode à appeler en fonction des paramètres d'entrée. Voici un exemple de code :

<?php
class A
{
    function construct()
    {
        echo "执行构造函数<br/>";
$a = func_get_args(); //获取构造函数中的参数
        $i = count($a);
        if (method_exists($this,$f=&#39;construct&#39;.$i)) {
call_user_func_array(array($this,$f),$a);
        }
    }
    function construct1($a1)
    {
        echo "1个参数".$a1."<br/>";
    }
    function construct2($a1,$a2)
    {
        echo "2个参数".$a1.",".$a2."<br/>";
    }
function construct3($a1,$a2,$a3)
    {
          echo "3个参数".$a1.",".$a2.",".$a3."<br/>";
    }
}
$o = new A(&#39;a&#39;);
$o = new A(&#39;a&#39;,&#39;b&#39;);
$o = new A(&#39;a&#39;,&#39;b&#39;,&#39;c&#39;);
?>

Exécuter le constructeur
1 paramètre a
Exécuter le constructeur
2 paramètres a,b
Exécuter le constructeur
3 paramètres a, b, c

D'ailleurs, tout comme C# et autres langages orientés objet, en PHP, si le constructeur est défini sur private ou protected, l'objet ne peut pas être instancié. .

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