함수에서의 디폴트 인수 사용
PHP 함수의 디폴트값이 헷갈립니다.다음과 같은 기능이 있다고 가정합니다.
function foo($blah, $x = "some value", $y = "some other value") {
// code here!
}
$x에 대해 기본 인수를 사용하고 $y에 대해 다른 인수를 설정하려면 어떻게 해야 합니까?
나는 다른 방법들을 실험해 보았고 나는 단지 더 혼란스러워지고 있어요.예를 들어 다음 두 가지를 시도했습니다.
foo("blah", null, "test");
foo("blah", "", "test");
그러나 둘 다 $x에 대한 적절한 기본 인수가 되지 않습니다.저도 변수 이름으로 설정하려고 했습니다.
foo("blah", $x, $y = "test");
이런 게 먹힐 줄 알았어.그런데 전혀 생각대로 되지 않아요.어떤 작업을 해도 함수를 호출할 때마다 기본 인수를 입력해야 할 것 같습니다.내가 뭔가 놓치고 있는 게 틀림없어
함수 선언을 다음과 같이 변경할 것을 제안합니다.
function foo($blah, $x = null, $y = null) {
if (null === $x) {
$x = "some value";
}
if (null === $y) {
$y = "some other value";
}
code here!
}
하면 를 걸 수요.foo('blah', null, 'non-default y value');
매개 변수인 '마음대로 '에서 '마음대로 '가 .$x
는 여전히 기본값을 가져옵니다.
이 방법에서는 null 값을 전달하면 파라미터 뒤에 오는 파라미터의 기본값을 덮어쓸 때 파라미터의 기본값을 사용할 수 있습니다.
다른 답변에도 있듯이
default 파라미터는 함수의 마지막 인수로만 기능합니다.함수 정의에서 기본값을 선언하는 경우 한 개의 매개 변수를 생략하고 다음 매개 변수를 재정의할 수 없습니다.
파라미터의 수나 타입이 다른 파라미터에 대응할 수 있는 방법이 있으면 Ryan P의 답변과 같은 함수를 선언하는 경우가 많습니다.
다음은 또 다른 예입니다(질문에 대한 답변은 아니지만 참고가 되었으면 합니다).
public function __construct($params = null)
{
if ($params instanceof SOMETHING) {
// single parameter, of object type SOMETHING
} elseif (is_string($params)) {
// single argument given as string
} elseif (is_array($params)) {
// params could be an array of properties like array('x' => 'x1', 'y' => 'y1')
} elseif (func_num_args() == 3) {
$args = func_get_args();
// 3 parameters passed
} elseif (func_num_args() == 5) {
$args = func_get_args();
// 5 parameters passed
} else {
throw new \InvalidArgumentException("Could not figure out parameters!");
}
}
옵션의 인수는 함수 호출의 마지막에만 기능합니다.함수에서 $x를 지정하지 않으면 $y 값을 지정할 수 없습니다. 일부 언어에서는 이름 있는 파라미터(VB/C# 등)를 통해 이를 지원하지만 PHP는 지원하지 않습니다.
파라미터에 인수 대신 연관 배열을 사용하면 이를 에뮬레이트할 수 있습니다.
function foo(array $args = array()) {
$x = !isset($args['x']) ? 'default x value' : $args['x'];
$y = !isset($args['y']) ? 'default y value' : $args['y'];
...
}
그런 다음 함수를 다음과 같이 호출합니다.
foo(array('y' => 'my value'));
실제로 다음과 같은 일이 가능합니다.
foo( 'blah', (new ReflectionFunction('foo'))->getParameters()[1]->getDefaultValue(), 'test');
그렇게 하고 싶은지 아닌지는 다른 이야기입니다.
갱신:
이 솔루션을 회피하는 이유는 다음과 같습니다.
- 보기 흉하다
- 오버헤드가 뚜렷합니다.
- 다른 답이 증명하듯이, 다른 대안이 있다.
그러나 실제로는 다음과 같은 상황에서 유용합니다.
원래 기능을 변경하지 않거나 변경할 수 없습니다.
기능을 변경할 수 있지만:
- 사용.
null
(또는 동등한 것)은 옵션이 아닙니다(DiegoDD의 코멘트 참조). - 동료나 동료 중 어느 쪽과도 함께 가고 싶지 않다
func_num_args()
- 당신의 목숨은 LOC를 몇 개 구하는 것에 달려있다.
- 사용.
퍼포먼스에 대해서는 매우 간단한 테스트로 Reflection API를 사용하여 기본 파라미터를 취득하면 함수 호출이 25배 느려지는 반면 1마이크로초 미만이 걸린다는 것을 알 수 있습니다.당신은 그걸 감수할 수 있는지 알아야 해요.
물론 루프에서 사용하는 경우에는 사전에 기본값을 설정해야 합니다.
function image(array $img)
{
$defaults = array(
'src' => 'cow.png',
'alt' => 'milk factory',
'height' => 100,
'width' => 50
);
$img = array_merge($defaults, $img);
/* ... */
}
명명된 인수를 사용하는 PHP 8
인수 $x에 기본값을 사용하고 $y 값을 설정하려면 어떻게 해야 합니까?
foo($blah, $x = "some value", $y = "some other value")
사용방법-1:
foo(blah: "blah", y: "test");
용도-2:
// use names to address last arguments
foo("blah", y: "test");
네이티브 기능에서도 이 기능을 사용합니다.
htmlspecialchars($string, double_encode: false);
// Same as
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
기능과 매뉴얼에 대해서
명명된 인수를 사용하면 매개 변수 위치가 아닌 매개 변수 이름을 기준으로 함수에 인수를 전달할 수 있습니다.이를 통해 인수의 의미를 스스로 문서화하고 인수를 순서에 구애받지 않고 임의로 기본값을 건너뛸 수 있습니다.
IDE 지원
Netbeans 12.3은 명명된 인수에 대한 코드 완성을 제외하고 이 기능을 포함한 PHP 8.0 구문을 완전히 지원합니다.
내가 아는 유일한 방법은 매개 변수를 생략하는 것이다.파라미터를 생략하는 유일한 방법은 생략할 파라미터가 설정할 파라미터 뒤에 오도록 파라미터 리스트를 재정렬하는 것입니다.예를 들어 다음과 같습니다.
function foo($blah, $y = "some other value", $x = "some value")
그런 다음 foo를 호출할 수 있습니다.
foo("blah", "test");
그 결과, 다음과 같은 결과가 됩니다.
$blah = "blah";
$y = "test";
$x = "some value";
저는 최근에 이런 문제를 겪었고 이 질문과 답변을 발견했습니다.위의 질문은 유효하지만 PHPStorm 등의 IDE에 기본값을 표시하지 않는 것이 문제입니다.
사용한다면null
빈칸으로 두면 값이 얼마인지 알 수 없습니다.
제가 선호하는 솔루션은 다음과 같이 함수 정의에 기본값을 추가하는 것입니다.
protected function baseItemQuery(BoolQuery $boolQuery, $limit=1000, $sort = [], $offset = 0, $remove_dead=true)
{
if ($limit===null) $limit =1000;
if ($sort===null) $sort = [];
if ($offset===null) $offset = 0;
...
유일한 차이점은 같은 것을 확실히 해야 한다는 것입니다.그러나 그 이상의 명확성을 위해 지불하기에는 적은 대가라고 생각합니다.
PHP 8에서는 이 문제에 대해 명명된 인수를 사용할 수 있습니다.
따라서 이 질문의 원본 포스터에서 설명한 문제를 해결할 수 있습니다.
$x에 대해 기본 인수를 사용하고 $y에 대해 다른 인수를 설정하려면 어떻게 해야 합니까?
포함:
foo(blah: "blah", y: "test");
참고 자료: https://wiki.php.net/rfc/named_params (특히 "Skiping defaults" 섹션)
직접 할 수는 없지만 코드를 조금만 만지작거리면 에뮬레이션이 가능합니다.
function foo($blah, $x = false, $y = false) {
if (!$x) $x = "some value";
if (!$y) $y = "some other value";
// code
}
또한 다음과 같이 호출할 수 있도록 인수로서 빈 문자열이 있는지 여부를 확인할 수 있습니다.
foo('blah', "", 'non-default y value', null);
함수 아래:
function foo($blah, $x = null, $y = null, $z = null) {
if (null === $x || "" === $x) {
$x = "some value";
}
if (null === $y || "" === $y) {
$y = "some other value";
}
if (null === $z || "" === $z) {
$z = "some other value";
}
code here!
}
부분은 채워도 상관없습니다.null
★★★★★★★★★★★★★★★★★」""
거예요
내 2센트와 null couldering 연산자는 ??
7 )(PHP 7 후))
function foo($blah, $x = null, $y = null) {
$varX = $x ?? 'Default value X';
$varY = $y ?? 'Default value Y';
// ...
}
자세한 예는 repl.it에서 확인하실 수 있습니다.
이것은 오브젝트가 더 나은 경우입니다.x 와 y 를 유지하도록 오브젝트를 설정할 수 있기 때문에 기본값 등을 설정할 수 있습니다.
어레이를 사용한 접근법은 오브젝트를 작성하기 위해 접근하고 있습니다(실제로 오브젝트는 오브젝트 상에서 동작하는 파라미터와 함수 집합이며, 어레이를 취득하는 함수는 몇 개의 ov 파라미터 상에서 동작합니다).
물론 늘(null) 등을 기본값으로 설정하기 위한 몇 가지 트릭을 언제든지 수행할 수 있습니다.
<?php
function info($name="George",$age=18) {
echo "$name is $age years old.<br>";
}
info(); // prints default values(number of values = 2)
info("Nick"); // changes first default argument from George to Nick
info("Mark",17); // changes both default arguments' values
?>
개별 매개 변수 대신 배열을 함수에 전달하고 Null 병합 연산자(PHP 7+)를 사용합니다.
아래 2개의 아이템이 포함된 어레이를 전달합니다.함수 내에서 item1의 값이 설정되어 있는지, 기본 볼트가 할당되어 있지 않은지 확인합니다.
$args = ['item2' => 'item2',
'item3' => 'value3'];
function function_name ($args) {
isset($args['item1']) ? $args['item1'] : 'default value';
}
PHP 8가지 방법:
function foo($blah, ?$x, ?$y) {
$x = $x ?? "some value";
$y = $y ?? "some other value";
}
또 다른 방법:
function sum($args){
$a = $args['a'] ?? 1;
$b = $args['b'] ?? 1;
return $a + $b;
}
echo sum(['a' => 2, 'b' => 3]); // 5
echo sum(['a' => 2]); // 3 (2+1)
echo sum(['b' => 3]); // 4 (1+3)
echo sum([]); // 2 (1+1)
언급URL : https://stackoverflow.com/questions/9166914/using-default-arguments-in-a-function
'programing' 카테고리의 다른 글
MySQL의 JSON 어레이를 행으로 변환 (0) | 2022.10.01 |
---|---|
Join을 사용한 JPA 업데이트 (0) | 2022.10.01 |
Larabel - 임시 삭제 - 투고를 다른 테이블로 이동 (0) | 2022.10.01 |
Linux에서 Mariadb 10과 호환되는 ODBC 드라이버가 있습니까? (0) | 2022.10.01 |
URL에서 도메인 구문 분석 (0) | 2022.10.01 |