선택적 매개 변수를 사용하는 PHP 함수
10개의 파라미터를 수용할 수 있는 PHP 함수를 작성했지만 2개만 필요합니다.8번째 파라미터를 정의하고 싶을 때도 있지만 8번째 파라미터가 될 때까지 각 파라미터에 빈 문자열을 입력하고 싶지 않습니다.
한 가지 아이디어는 추상화된 함수를 매개 변수 배열과 함께 전달하여 실제 함수에 전달하는 것이었습니다.
원하는 파라미터만 전달할 수 있도록 기능을 설정하는 더 좋은 방법이 있나요?
이 경우 키는 파라미터 이름이고 값은 값인 배열을 전달합니다.
$optional = array(
"param" => $param1,
"param2" => $param2
);
function func($required, $requiredTwo, $optional) {
if(isset($optional["param2"])) {
doWork();
}
}
함수에 배열이라는 하나의 매개 변수를 가져오도록 합니다.실제 매개 변수를 배열의 값으로 전달합니다.
편집: Pekka의 코멘트에 있는 링크는 그것을 요약합니다.
원하는 것을 달성하려면 Rabbot이 말한 것처럼 어레이를 사용합니다(다만 과도하게 사용하면 문서화/유지관리가 번거로울 수 있습니다).또는 기존의 옵션인 arg를 사용합니다.
//My function with tons of optional params
function my_func($req_a, $req_b, $opt_a = NULL, $opt_b = NULL, $opt_c = NULL)
{
//Do stuff
}
my_func('Hi', 'World', null, null, 'Red');
하지만, 저는 보통 그렇게 많은 인수를 가지고 함수/방법을 쓰기 시작하면 코드 냄새이며, 훨씬 더 깨끗한 것으로 재요인/추출될 수 있다는 것을 알게 됩니다.
//Specialization of my_func - assuming my_func itself cannot be refactored
function my_color_func($reg_a, $reg_b, $opt = 'Red')
{
return my_func($reg_a, $reg_b, null, null, $opt);
}
my_color_func('Hi', 'World');
my_color_func('Hello', 'Universe', 'Green');
기본값을 null로 설정할 수 있습니다.
<?php
function functionName($value, $value2 = null) {
// do stuff
}
PHP 5.6 이후에서는 인수 목록은 함수가 변수 개수의 인수를 받아들이는 것을 나타내는 ... 토큰을 포함할 수 있습니다.인수는 지정된 변수에 배열로 전달됩니다.다음은 예를 제시하겠습니다.
예: 변수 인수에 액세스하기 위해 ...을 사용하는 경우
<?php
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {
$acc += $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
?>
위의 예는 다음과 같습니다.
10
메모: 이것은 PHP 5.5 이하에 대한 오래된 답변입니다.PHP 5.6+는 기본 인수를 지원합니다.
PHP 5.5 이하에서는 다음 두 가지 방법 중 하나를 사용하여 이를 수행할 수 있습니다.
- func_num_params() 및 func_get_param() 함수를 사용합니다.
- NULL 인수를 사용합니다.
사용방법
function method_1()
{
$arg1 = (func_num_args() >= 1)? func_get_arg(0): "default_value_for_arg1";
$arg2 = (func_num_args() >= 2)? func_get_arg(1): "default_value_for_arg2";
}
function method_2($arg1 = null, $arg2 = null)
{
$arg1 = $arg1? $arg1: "default_value_for_arg1";
$arg2 = $arg2? $arg2: "default_value_for_arg2";
}
저는 두 번째 방법이 깨끗하고 이해하기 쉽기 때문에 선호합니다만, 첫 번째 방법이 필요할 수도 있습니다.
「 」부터 합니다.PHP 8
이름 있는 인수를 사용할 수 있습니다.
function namedParameters($paramOne, $paramTwo, $paramThree = 'test', $paramFour = null)
{
dd($paramOne, $paramTwo, $paramThree, $paramFour);
}
함수는 이 함수로 할 수 .required
Params와 Optinal Params만 다를 수 있습니다.default
함수에 지정한 값입니다.
namedParameters('one', 'two', paramFour: 'four');
결과:
// "one", "two", "test", "four"
물건을 파라암으로 운반할 수도 있을 것 같아요.
$myParam = new stdClass();
$myParam->optParam2 = 'something';
$myParam->optParam8 = 3;
theFunction($myParam);
function theFunction($fparam){
return "I got ".$fparam->optParam8." of ".$fparam->optParam2." received!";
}
물론 이 함수에서는 "optParam8" 및 "optParam2"의 기본값을 설정해야 합니다.그렇지 않으면 "Notice:정의되지 않은 속성: stdClass:: $optParam2"
배열을 함수 파라미터로 사용하는 경우 기본값을 설정하는 방법은 다음과 같습니다.
function theFunction($fparam){
$default = array(
'opt1' => 'nothing',
'opt2' => 1
);
if(is_array($fparam)){
$fparam = array_merge($default, $fparam);
}else{
$fparam = $default;
}
//now, the default values are overwritten by these passed by $fparam
return "I received ".$fparam['opt1']." and ".$fparam['opt2']."!";
}
유효한 상태의 오브젝트를 작성하기 위해 필요한 값이 2개뿐인 경우, 다른 모든 옵션 인수를 삭제하고 (실행 시에 변경하지 않는 한) 그 인수에 세터를 지정할 수 있습니다.그런 다음 두 개의 필수 인수를 사용하여 개체를 인스턴스화하고 나머지 인수는 설정기를 통해 필요에 따라 설정합니다.
추가 정보
오래된 게시물인 건 알지만 작전과 같은 문제가 있어서 이렇게 생각해 낸 거예요.
통과할 수 있는 배열의 예.특정 주문이 필요한 경우 재주문할 수 있지만, 이 질문의 경우 요청하신 대로 처리됩니다.
$argument_set = array (8 => 'lots', 5 => 'of', 1 => 'data', 2 => 'here');
이 기능은 관리가 용이하고 읽기 쉬우며 데이터 추출 지점을 코딩으로 어디에 있든 즉시 추가 및 제거할 수 있으며 대규모 개서를 피할 수 있습니다.OP의 원래 질문과 일치하기 위해 정수 키를 사용했지만 문자열 키는 똑같이 쉽게 사용할 수 있었습니다.사실 가독성을 위해 나는 그것을 충고하고 싶다.
이 파일을 외부 파일에 쉽게 고정
function unknown_number_arguments($argument_set) {
foreach ($argument_set as $key => $value) {
# create a switch with all the cases you need. as you loop the array
# keys only your submitted $keys values will be found with the switch.
switch ($key) {
case 1:
# do stuff with $value
break;
case 2:
# do stuff with $value;
break;
case 3:
# key 3 omitted, this wont execute
break;
case 5:
# do stuff with $value;
break;
case 8:
# do stuff with $value;
break;
default:
# no match from the array, do error logging?
break;
}
}
return;
}
파일인 경우, 이것을 선두에 둡니다.
$argument_set = array();
데이터 출처에 따라 다음 데이터 사용 시 번호 지정/이름 지정만 할당하면 됩니다.
$argument_set[1][] = $some_variable;
마지막으로 어레이를 통과
unknown_number_arguments($argument_set);
function yourFunction($var1, $var2, $optional = Null){
... code
}
일반 함수를 만든 다음 기본 Null 값을 지정하여 옵션 변수를 추가할 수 있습니다.
Null은 여전히 값이며, 해당 변수의 값을 사용하여 함수를 호출하지 않으면 비어 있지 않으므로 오류가 발생하지 않습니다.
일반적으로 8번째 값만 전달하면 매개 변수를 먼저 정렬할 수 있습니다.마지막으로 설정할 파라미터까지만 지정하면 됩니다.
다른 값을 사용하는 경우 두 가지 옵션이 있습니다.
하나는 다른 파라미터를 사용하는 래퍼 함수 세트를 만들고 다른 파라미터에 기본값을 설정하는 것입니다.이것은 몇 가지 조합만 사용하는 경우 유용하지만, 금방 지저분해질 수 있습니다.
다른 옵션은 키를 매개 변수의 이름으로 하는 배열을 전달하는 것입니다.그런 다음 키를 사용하여 배열에 값이 있는지, 기본값을 사용하지 않는지 확인할 수 있습니다.그러나 파라미터가 많으면 이 작업이 복잡해지고 코드가 많이 추가됩니다.
PHP는 기본 인수(링크)를 허용합니다.이 경우 함수 코드에 따라 3~8의 모든 파라미터를 NULL 또는 빈 문자열로 정의할 수 있습니다.이 방법에서는 처음 두 개의 파라미터를 사용하여 함수를 호출할 수 있습니다.
예를 들어 다음과 같습니다.
<?php
function yourFunction($arg1, $arg2, $arg3=NULL, $arg4=NULL, $arg5=NULL, $arg6=NULL, $arg7=NULL, $arg8=NULL){
echo $arg1;
echo $arg2;
if(isset($arg3)){echo $arg3;}
# other similar statements for $arg4, ...., $arg5
if(isset($arg8)){echo $arg8;}
}
사용하지 않을 파라미터를 무시하려면 Null을 설정한 다음 위치에 따라 필요한 파라미터를 설정합니다.
function myFunc($p1,$p2,$p3=Null,$p4=Null,$p5=Null,$p6=Null,$p7=Null,$p8=Null){
for ($i=1; $i<9; $i++){
$varName = "p$i";
if (isset($$varName)){
echo $varName." = ".$$varName."<br>\n";
}
}
}
myFunc( "1", "2", Null, Null, Null, Null, Null, "eight" );
func( "1", "2", default, default, default, default, default, "eight" );
언급URL : https://stackoverflow.com/questions/3978929/php-function-with-optional-parameters
'programing' 카테고리의 다른 글
Firebase 앱이 Android에서 이미 초기화되었는지 확인하는 방법 (0) | 2022.09.14 |
---|---|
URL에서 fragment ID(해시 번호 이후의 값)를 취득하려면 어떻게 해야 합니까? (0) | 2022.09.14 |
pip 설치에서 각 괄호는 무엇을 의미합니까? (0) | 2022.09.14 |
이전 기능이 완료된 후 함수를 호출합니다. (0) | 2022.09.14 |
Maria에서 암호 재시도 횟수를 설정할 수 없습니다.DB (0) | 2022.09.14 |