함수에서 기본 인수 사용
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 값을 전달하면 그 뒤에 오는 매개 변수의 기본값을 재정의하려는 경우 한 매개 변수의 기본값을 원한다는 의미입니다.
다른 답변에서 언급했듯이
기본 매개 변수는 함수의 마지막 인수로만 작동합니다. 함수 정의에서 기본값을 선언하려는 경우 하나의 매개 변수를 생략하고 그 뒤에있는 매개 변수를 대체 할 방법이 없습니다.
다양한 수의 매개 변수와 다양한 유형의 매개 변수를 사용할 수있는 방법이 있다면 Ryan P가 표시 한 답변과 비슷한 함수를 선언하는 경우가 많습니다.
다음은 또 다른 예입니다 (이것은 귀하의 질문에 대답하지 않지만 유익한 정보입니다 :
public function __construct($params = null)
{
if ($params instanceof SOMETHING) {
// single parameter, of object type SOMETHING
} else if (is_string($params)) {
// single argument given as string
} else if (is_array($params)) {
// params could be an array of properties like array('x' => 'x1', 'y' => 'y1')
} else if (func_num_args() == 3) {
$args = func_get_args();
// 3 parameters passed
} else if (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');
당신이 그렇게하고 싶은지는 또 다른 이야기입니다 :)
최신 정보:
이 솔루션을 피하는 이유는 다음과 같습니다.
- 그것은 (논쟁 적으로) 추악하다
- 명백한 오버 헤드가 있습니다.
- 다른 답변이 증명했듯이 대안이 있습니다.
그러나 실제로 다음과 같은 상황에서 유용 할 수 있습니다.
- 원래 기능을 원하지 않거나 변경할 수 없습니다.
기능을 변경할 수는 있지만
- using
null
(or equivalent) is not an option (see DiegoDD's comment) - you don't want to go either with an associative or with
func_num_args()
- your life depends on saving a couple of LOCs
- using
About the performance, a very simple test shows that using the Reflection API to get the default parameters makes the function call 25 times slower, while it still takes less than one microsecond. You should know if you can to live with that.
Of course, if you mean to use it in a loop, you should get the default value beforehand.
function image(array $img)
{
$defaults = array(
'src' => 'cow.png',
'alt' => 'milk factory',
'height' => 100,
'width' => 50
);
$img = array_merge($defaults, $img);
/* ... */
}
The only way I know of doing it is by omitting the parameter. The only way to omit the parameter is to rearrange the parameter list so that the one you want to omit is after the parameters that you HAVE to set. For example:
function foo($blah, $y = "some other value", $x = "some value")
Then you can call foo like:
foo("blah", "test");
This will result in:
$blah = "blah";
$y = "test";
$x = "some value";
You can't do this directly, but a little code fiddling makes it possible to emulate.
function foo($blah, $x = false, $y = false) {
if (!$x) $x = "some value";
if (!$y) $y = "some other value";
// code
}
I recently had this problem and found this question and answers. While the above questions work, the problem is that they don't show the default values to IDEs that support it (like PHPStorm).
if you use null
you won't know what the value would be if you leave it blank.
The solution I prefer is to put the default value in the function definition also:
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;
...
The only difference is that I need to make sure they are the same - but I think that's a small price to pay for the additional clarity.
<?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
?>
This is case, when object are better - because you can set up your object to hold x and y , set up defaults etc.
Approach with array is near to create object ( In fact, object is bunch of parameters and functions which will work over object, and function taking array will work over some bunch ov parameters )
Cerainly you can always do some tricks to set null or something like this as default
You can also check if you have an empty string as argument so you can call like:
foo('blah', "", 'non-default y value', null);
Below the function:
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!
}
It doesn't matter if you fill null
or ""
, you will still get the same result.
Pass an array to the function, instead of individual parameters and use null coalescing operator (PHP 7+).
Below, I'm passing an array with 2 items. Inside the function, I'm checking if value for item1 is set, if not assigned default vault.
$args = ['item2' => 'item2',
'item3' => 'value3'];
function function_name ($args) {
isset($args['item1']) ? $args['item1'] : 'default value';
}
참고URL : https://stackoverflow.com/questions/9166914/using-default-arguments-in-a-function
'Programing' 카테고리의 다른 글
std :: decay는 무엇이며 언제 사용해야합니까? (0) | 2020.06.01 |
---|---|
JSON 데이터에서 JSON 스키마를 생성하는 도구 (0) | 2020.06.01 |
InstallUtil.exe없이 .NET Windows 서비스 설치 (0) | 2020.06.01 |
ng-repeat 내에서 $ index를 사용하여 클래스를 활성화하고 DIV를 표시하려면 어떻게해야합니까? (0) | 2020.06.01 |
PostgreSQL 명명 규칙 (0) | 2020.06.01 |