PHP函数param类型的最佳实践

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

例:

// 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
 }
}

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

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

编辑!!!

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

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是一种类型,不能决定它是否应该
如果你输入一个类名,它不会检查实例但只是做了类型检查
还没有想出一个触发错误的好方法……嗯

多数民众赞成在我看来,这些错误很容易解决:D

解决方法:

这取决于.

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
}

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...