PHP函数param类型的最佳实践

时间:2011-01-21 02:07:59

标签: php frameworks

我目前正在开发一个框架,并且已经遇到了麻烦...当有人在框架中调用函数时,我应该如何处理不正确的参数类型?

示例:

// Title is expected to be string, comment_num is expected to be int
function example1($title, $comment_num) {


 // Doesnt throw error, just converts type 
 $title = (string) $title;
 $comment_num = (int) $comment_num;

}

// Title is expected to be string, comment_num is expected to be int

function example2($title, $comment_num) {


 if (!is_string($title)) {

  trigger_error('String expected for first parameter', E_USER_WARNING);
  return;
 }

 if (!is_string($title)) {

  trigger_error('Int expected for second parameter', E_USER_WARNING);
  return
 }
}

或者两者兼而有之?抛出错误并转换类型?

这样做的最佳方法是什么?我打算发布它,所以它不仅仅是我使用它,因此我想为其他人想出最好的方法。感谢。

EDIT !!!

所以我决定给出答案,但我也想发布我制作的代码,这可以让我快速检查类型。它很粗糙,但效果很好。

function __type_check($params) {

    if (count($params) < 1) {

        return; 
    }
    $types = func_get_args();
    array_shift($types);

    $backtrace = debug_backtrace();
    $backtrace = $backtrace[1];

    $global_types = array(
        'bool'  => 'boolean',
        'int'   => 'integer',
        'float' => 'double' 
    );

    $error = false;


    for ($i = 0, $j = count($types); $i < $j; ++$i) {

        if (strpos($types[$i], ',') === false) {

            $type = strtolower($types[$i]);

            if (isset($global_types[$type])) {

                $type = $global_types[$type];
            }

            if (gettype($params[$i]) != $type) {
                $error = true;
                break;
            }

        } else {

            $current_types = array_map('trim', explode(',', $types[$i]));

            foreach ($current_types as $type) {

                $type = strtolower($type);  

                if (isset($global_types[$type])) {

                    $type = $global_types[$type];
                }

                if (gettype($params[$i]) == $type) {

                    continue 2; 
                }
            }

            $error = true;
            break;
        }       
    }

    if ($error) {
        trigger_error($backtrace['function'] . '() expects parameter ' . ($i + 1) . ' to be ' . $types[$i] . ', ' . gettype($params[$i]) . ' given', E_USER_WARNING);
        return false;
    }

    return true;
}

你会像这样使用它:

function string_manipulation($str, $str2, $offset = 1) {

    if (!__type_check(func_get_args(), 'string', 'string', 'int,float')) {

        return false;   
    }   

    // do manipulation here
}

那基本上会检查第一个和第二个参数是字符串,第三个参数是整数还是浮点数。您可以组合任何类型的'string,int,array,object'等,所有有效类型都取自gettype

/ *已知错误* / null是一种类型,不能决定它是否应该 如果你输入一个类名,它不会检查实例但只是做了类型检查 还没有想出一个触发错误的好方法...... meh

这是我的错误,可以很容易地修复错误:D

3 个答案:

答案 0 :(得分:6)

取决于。

PHP是一种动态类型语言,有时是有充分理由的。由于它对HTTP数据进行了大量处理,这些数据始终是所有字符串,因此数字不一定总是int类型,并且对于一般操作仍然可以正常工作。

严格执行原始类型通常非常不符合PHP,并且可能很麻烦。

在PHP中执行操作的常用方法是接受几乎任何类型的参数并善意地使用它们,直到您需要具有特定结果或类型成为问题。

function example1($title, $comment_num) {

    // do some operations that should work error-free regardless of type

    if ($result != 'something specific you expect here') {
        throw new Exception('Something went wrong!');
        // or
        trigger_error('Something went wrong!');
        return false;
    }

    // continue with $result
}

您可以通过OOP路线以这种方式构建对象。对象在某种程度上可以灵活接受。如果它们成功构建,您就可以使用特定类型的已定义对象来进行PHP强制类型提示:

function example1(TitleObject $title) {
    // rest assured that $title is of the right type
}

答案 1 :(得分:0)

如果有的话,只需使用SPLTypes即可完成;否则抛出InvalidArgument例外

答案 2 :(得分:0)

我会自动对int和string数据类型进行类型转换而不会抱怨(因为它们很容易混淆),但是对于像资源或对象这样的东西,它可能是一个有用的功能,可以通知程序员错误。

我还会在自己的函数中设置通知代码,这样事情就不会那么重复了。无论如何,祝你好运!