PHP函数重载 来自C++背景;br> 如何重载PHP函数

PHP函数重载 来自C++背景;br> 如何重载PHP函数,php,arguments,overloading,Php,Arguments,Overloading,一个函数定义(如果有参数),另一个函数定义(如果没有参数)? 在PHP中可能吗?或者我应该使用if-else检查是否有从$\u GET和POST传递的任何参数??并将它们关联起来?您不能重载PHP函数。函数签名仅基于它们的名称,不包括参数列表,因此不能有两个同名函数。类在PHP中与许多其他语言中不同。PHP使用相同的词,但它描述了不同的模式 但是,您可以声明一个接受可变数量参数的。您将使用和来传递参数,并正常使用它们 例如: function myFunc() { for ($i = 0

一个函数定义(如果有参数),另一个函数定义(如果没有参数)?
在PHP中可能吗?或者我应该使用if-else检查是否有从$\u GET和POST传递的任何参数??并将它们关联起来?

您不能重载PHP函数。函数签名仅基于它们的名称,不包括参数列表,因此不能有两个同名函数。类在PHP中与许多其他语言中不同。PHP使用相同的词,但它描述了不同的模式

但是,您可以声明一个接受可变数量参数的。您将使用和来传递参数,并正常使用它们

例如:

function myFunc() {
    for ($i = 0; $i < func_num_args(); $i++) {
        printf("Argument %d: %s\n", $i, func_get_arg($i));
    }
}

/*
Argument 0: a
Argument 1: 2
Argument 2: 3.5
*/
myFunc('a', 2, 3.5);
函数myFunc(){
对于($i=0;$i
PHP不支持传统的方法重载,但是您可以通过使用
\u调用
魔术方法来实现所需的功能:

class MyClass {
    public function __call($name, $args) {

        switch ($name) {
            case 'funcOne':
                switch (count($args)) {
                    case 1:
                        return call_user_func_array(array($this, 'funcOneWithOneArg'), $args);
                    case 3:
                        return call_user_func_array(array($this, 'funcOneWithThreeArgs'), $args);
                 }
            case 'anotherFunc':
                switch (count($args)) {
                    case 0:
                        return $this->anotherFuncWithNoArgs();
                    case 5:
                        return call_user_func_array(array($this, 'anotherFuncWithMoreArgs'), $args);
                }
        }
    }

    protected function funcOneWithOneArg($a) {

    }

    protected function funcOneWithThreeArgs($a, $b, $c) {

    }

    protected function anotherFuncWithNoArgs() {

    }

    protected function anotherFuncWithMoreArgs($a, $b, $c, $d, $e) {

    }

}

对某些人来说,这可能有点骇人听闻,但我是从Cakephp如何执行某些函数中了解到这一点的,并对其进行了调整,因为我喜欢它所带来的灵活性

想法是你有不同类型的参数,数组,对象等等,然后你检测你被传递了什么,然后从那里开始

function($arg1, $lastname) {
    if(is_array($arg1)){
        $lastname = $arg1['lastname'];
        $firstname = $arg1['firstname'];
    } else {
        $firstname = $arg1;
    }
    ...
}
那么这个呢:

function($arg = NULL) {

    if ($arg != NULL) {
        etc.
        etc.
    }
}

要重载函数,只需在默认情况下将参数传递为null

<?php

    class abs
    {
        public function volume($arg1=null, $arg2=null, $arg3=null)
        {   
            if($arg1 == null && $arg2 == null && $arg3 == null)
        {
            echo "function has no arguments. <br>";
        }

        else if($arg1 != null && $arg2 != null && $arg3 != null)
            {
            $volume=$arg1*$arg2*$arg3;
            echo "volume of a cuboid ".$volume ."<br>";
            }
            else if($arg1 != null && $arg2 != null)
            {
            $area=$arg1*$arg2;
            echo "area of square  = " .$area ."<br>";
            }
            else if($arg1 != null)
            {
            $volume=$arg1*$arg1*$arg1; 
            echo "volume of a cube = ".$volume ."<br>";
            }


        }


    }

    $obj=new abs();
    echo "For no arguments. <br>";
    $obj->volume();
    echo "For one arguments. <br>";
    $obj->volume(3);
    echo "For two arguments. <br>";
    $obj->volume(3,4);
    echo "For three arguments. <br>";
    $obj->volume(3,4,5);
    ?>
class父类
{
函数mymethod($arg1=null,$arg2=null,$arg3=null)
{  
如果($arg1==null&&$arg2==null&&$arg3==null){
return“函数有零个参数
”; } 其他的 { $str=''; 如果($arg1!=null) $str.=“arg1=”.$arg1.“
”; 如果($arg2!=null) $str.=“arg2=”.$arg2.“
”; 如果($arg3!=null) $str.=“arg3=”.$arg3.“
”; 返回$str; } } } //并按下面给出的顺序调用它。。。 $obj=新父类; echo“
$obj->mymethod()
”; echo$obj->mymethod(); echo'
$obj->mymethod(null,“test”)
; echo$obj->mymethod(null,'test'); echo'
$obj->mymethod(“测试”、“测试”、“测试”)
; echo$obj->mymethod('test','test','test');

PHP目前不支持重载。希望它能像其他编程语言一样在其他版本中实现

签出这个库,这将允许您在闭包方面使用PHP重载。
遗憾的是,PHP中没有像C#中那样的重载。但我有一个小把戏。我用默认的空值声明参数,并在函数中检查它们。这样,我的函数可以根据参数做不同的事情。下面是一个简单的例子:

function example(...$args)
{
   count($args); // Equivalent to func_num_args()
}

example(1, 2);
example(1, 2, 3, 4, 5, 6, 7);

在PHP5.6中,您可以使用
作为最后一个参数,并删除
func\u get\u args()
func\u num\u args()

您也可以使用它来解压缩参数:

example(1, 2, 3);
相当于:



我以前从未见过
\u call()
的这种用法。非常有创意(如果有点冗长)+1真正令人钦佩的_call()用法事实上,我不同意这一点,必须对这一建议进行重新训练。首先,使用_call()是一种反模式。其次,可以在PHP中为具有正确可见性的类方法执行重载。但是,您不能重载普通的jane函数。您能解释一下为什么您认为使用_call()是一种反模式吗?PHP方法重载不是OP想要的-他们希望能够有多个具有相同名称但不同输入/输出的方法签名:不需要使用uu call()。相反,声明一个具有所需名称的方法,不列出任何参数,并在该方法中使用func_get_args()将其分派到相应的私有实现。不,我不认为这有什么不妥,PHP对其许多内置函数都是这样做的。因为PHP是松散类型的,这正是必须处理这种情况的方式。这在php中是“必要的黑客行为”。您只能重载类方法,而不能重载函数。请参见,您可以创建一个函数,显式检查参数的数量,并根据预定义的参数集执行另一个函数。不管你最好重新设计你的解决方案,或者使用实现你的接口的类,PHP对重载的定义不同于典型的OOP语言。它们只是指允许基于X的属性和函数的动态路由的神奇方法。对于未来的读者:@Spechal所指的是一个与问题中所问的不同的单词
重载的含义。(有关更多详细信息,请参阅已接受的答案。)自PHP 7以来有任何更改吗你能解释一下如何使用这个类吗?1-创建新类2-扩展重载。3-创建函数,如funcname_uu()=>no args或funcname_us($s)=>string arg这是一个非常酷的解决方案。为什么要执行$o=new$obj()?我还没有试过,不过我觉得应该是\$o=\$this?谢谢你的重要通知,我将使用反斜杠,但它可以使用反斜杠,也可以不使用我使用phpAZZY作为本地服务器。如果超级负载将有不同的名称和含义,则不太可读。也许我已经做了太多的C++开发,但是我建议在函数参数(如代码> MyFunc(/*.*/))<代码>中做提示。@ DUG65636,PHP 5.6 +将支持这一点,让我们松了一口气或者看看,在像php这样的松散类型语言中,它更接近C++的重载——尽可能接近。在PHP7中更合适,因为如果参数是相同类型的,您可以为参数提供类型提示
public function query($queryString, $class = null) //second arg. is optional
{
    $query = $this->dbLink->prepare($queryString);
    $query->execute();

    //if there is second argument method does different thing
    if (!is_null($class)) { 
        $query->setFetchMode(PDO::FETCH_CLASS, $class);
    }

    return $query->fetchAll();
}

//This loads rows in to array of class
$Result = $this->query($queryString, "SomeClass");
//This loads rows as standard arrays
$Result = $this->query($queryString);
function example(...$args)
{
   count($args); // Equivalent to func_num_args()
}

example(1, 2);
example(1, 2, 3, 4, 5, 6, 7);
$args[] = 1;
$args[] = 2;
$args[] = 3;
example(...$args);
example(1, 2, 3);