编写具有许多参数/修饰符的PHP函数

时间:2011-12-21 15:58:40

标签: php oop design-patterns

请耐心等待,仔细阅读问题。所以这就是我所做的演示:PHP无法实现重叠功能。这是具有相同名称但具有不同参数数量的函数。例如,这在PHP中是不可能的,但可以用Java完成:

public class Testing() {

   public function doSometing() {
     // some useful code
   }

   public function doSometing(string $name) {
     // some useful code
   }

   public function doSometing(string $name, int type, string $connectedNews ) {
     // some useful code
   }         
}

现在为了创建一个灵活的函数,我看到有一种方法可以通过使用一个具有一些必要参数的唯一名称的函数来完成此操作,所有其他参数都是可选的。如果我们有很多可选字符,那么我们将它们放在名为options的数组中:

public function getCateogries( $lang = null, $options = array() ) {

    }

如果我们在数组中发送了很多选项,那么函数变得丑陋且难以阅读和使用。我知道php函数“func_get_arg但是”但我觉得这不是最好的方法。

问题是: 有没有更好的方法来做到这一点?有没有解决这类问题的模式?

3 个答案:

答案 0 :(得分:2)

这是对没有真正问题的帖子的猜测。也许你可以使用动态检查参数:

function GuessWhoByHowManyMaybe () {
    $NumberOfArguments = func_num_args();

    # get each one
    $ArrayOfArguments = func_get_args();
    for ($i = 0; $i < $NumberOfArguments; $i++) {
        echo "Argument " . $i . " is: " . $ArrayOfArguments[$i] . "\n";
    }

    # or grab one, in particular, right away
    if ($NumberOfArguments >= 2) {
        echo "Second argument is: " . func_get_arg(1) . "\n";
    }

    # example explained below this function
    if ($NumberOfArguments == 0) {
        // some useful code for when there are 0 arguments
    } elseif ($NumberOfArguments == 1) {
        // some useful code for when there is 1 argument
    }
}

你可以通过添加一些代码来检查参数的数量,然后执行一个动作,假设当传递一定数量的参数时,你可以按照你想要的方式行动,这意味着你可以做一些特定的动作。呃...如果你理解我的意思......

答案 1 :(得分:1)

你的意思是你想要一个带有重载的方法。这是可能的。有两种方法可以轻松完成此任务。

第一种是为参数设置默认值:

<?php
    public function foo($value1, $value2 = "", $value3 = false, $value4 = 2) { ... }
?>

现在$ value1是必需的,而其他是可选的。第二种方法涉及arrey,您可以检查是否存在某些键。例如:

<?php
    public function foo($params) { 
        if (array_key_exists('value1', $params) { ... do something ... }
        if (array_key_exists('value2', $params) { ... do something ... }
    }
?>

两者都是普遍接受的解决方案,也可以组合使用。

答案 2 :(得分:0)

class StupidJavaEnvySample {
    private function getMethodSignatureString($args) {
        return join('_', array_map('gettype', $args));
    }


    public function sayHi() {
        $args = func_get_args();
        $callable = array($this, 'sayHi__' . $this->getMethodSignatureString($args));
        return call_user_func_array($callable, $args);
    }

    //use naming convention for the overloaded methods.
    private function sayHi__string_object($str, $obj) {
        echo 'so';
    }
    private function sayHi__array_array($arr1, $arr2) {
        echo 'aa';
    }
}

$o = new StupidJavaEnvySample();
$o->sayHi(array(), array());

我的样本没有区分不同类型的对象,但我确定你可以用反射来解决这个问题。无论如何,php几乎没有用它,因为它是一种动态语言。