来自c++背景;) 如何重载PHP函数?

一个函数定义如果有参数,另一个函数定义如果没有参数? 这在PHP中可行吗?或者我应该使用if else来检查是否有任何参数从$_GET和POST传递??把它们联系起来?


当前回答

不幸的是,在PHP中没有像在c#中那样的重载。但是我有一个小技巧。我用默认空值声明参数,并在函数中检查它们。这样我的函数就可以根据参数做不同的事情。下面是一个简单的例子:

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);

其他回答

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

但是,您可以声明一个可变参数函数,该函数接受可变数量的参数。您可以使用func_num_args()和func_get_arg()来获取传递的参数,并正常使用它们。

例如:

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);

对某些人来说,这可能有点棘手,但我从Cakephp处理某些函数的方式中学到了这种方法,并对其进行了调整,因为我喜欢它所创造的灵活性

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

function($arg1, $lastname) {
    if(is_array($arg1)){
        $lastname = $arg1['lastname'];
        $firstname = $arg1['firstname'];
    } else {
        $firstname = $arg1;
    }
    ...
}

在PHP 5.6中,你可以使用splat操作符…作为最后一个参数,去掉func_get_args()和func_num_args():

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);

那么这个呢:

function($arg = NULL) {

    if ($arg != NULL) {
        etc.
        etc.
    }
}
<?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);
    ?>