gpt4 book ai didi

PHP函数参数类型最佳实践

转载 作者:可可西里 更新时间:2023-11-01 00:37:07 26 4
gpt4 key购买 nike

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

例子:

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

这基本上会检查第一个和第二个参数是字符串,第三个参数是整数还是 float 。您可以组合任何类型 '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
}

关于PHP函数参数类型最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4754759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com