programing

함수 호출에서 옵션 인수를 건너뛰려면 어떻게 해야 합니까?

goodsources 2022. 10. 20. 21:20
반응형

함수 호출에서 옵션 인수를 건너뛰려면 어떻게 해야 합니까?

네, PHP에서 인수를 건너뛰는 방법을 완전히 잊어버렸습니다.

예를 들어 다음과 같습니다.

function getData($name, $limit = '50', $page = '1') {
    ...
}

이 함수를 호출하면 중간 파라미터가 기본값(즉,'50')?

getData('some name', '', '23');

위의 내용이 맞습니까?이 일이 잘 풀리지 않을 것 같아요.

당신의 글은 정확합니다.

유감스럽게도 파라미터 리스트의 맨 끝에 옵션파라미터를 사용해야 할 경우 마지막 파라미터까지 모두 지정해야 합니다.할 " " " 를 합니다.'' ★★★★★★★★★★★★★★★★★」null디폴트값일 경우 함수 내에서 사용하지 마십시오.

아니요, 이런 식으로 논쟁을 건너뛸 수는 없어요.매개 변수 목록의 끝에 있는 경우에만 인수 전달을 생략할 수 있습니다.

이에 대한 공식 제안이 있었습니다. https://wiki.php.net/rfc/skipparams,는 거절되었습니다.제안 페이지는 이 주제에 대한 다른 SO 질문으로 연결됩니다.

false ★★★★★★★★★★★★★★★★★」null

PHP에는 구문설탕이 부족하기 때문에 다음과 같은 것을 자주 볼 수 있습니다.

checkbox_field(array(
    'name' => 'some name',
    ....
));

댓글에서 웅변적으로 언급했듯이 어레이를 사용하여 명명된 인수를 에뮬레이트하고 있습니다.

이는 궁극의 유연성을 제공하지만 경우에 따라서는 필요하지 않을 수 있습니다.적어도 대부분의 경우 기대되지 않는다고 생각되는 것을 인수 목록의 끝으로 이동할 수 있습니다.

옵션 인수를 건너뛸 수 있는 것에 대해서는 아무것도 변경되지 않았지만 올바른 구문을 위해 건너뛸 인수에 대해 NULL을 지정할 수 있는 방법은 다음과 같습니다.

define('DEFAULT_DATA_LIMIT', '50');
define('DEFAULT_DATA_PAGE', '1');

/**
 * getData
 * get a page of data 
 *
 * Parameters:
 *     name - (required) the name of data to obtain
 *     limit - (optional) send NULL to get the default limit: 50
 *     page - (optional) send NULL to get the default page: 1
 * Returns:
 *     a page of data as an array
 */

function getData($name, $limit = NULL, $page = NULL) {
    $limit = ($limit===NULL) ? DEFAULT_DATA_LIMIT : $limit;
    $page = ($page===NULL) ? DEFAULT_DATA_PAGE : $page;
    ...
}

'하다'라고 할 수 .getData('some name',NULL,'23');향후 함수를 호출하는 사람은 매번 기본값이나 선언된 상수를 기억할 필요가 없습니다.

간단한 대답은 "아니오"입니다.하지만 논쟁을 다시 정리할 때 왜 건너뛸까요?

"기본 함수 인수의 잘못된 사용"으로 예상대로 작동하지 않습니다.

PHP 문서의 참고 사항:

기본 인수를 사용할 경우 기본값이 아닌 인수 오른쪽에 있어야 합니다. 그렇지 않으면 모든 것이 예상대로 작동하지 않습니다.

다음 사항을 고려하십시오.

function getData($name, $limit = '50', $page = '1') {
    return "Select * FROM books WHERE name = $name AND page = $page limit $limit";
}

echo getData('some name', '', '23');   // won't work as expected

출력은 다음과 같습니다.

"Select * FROM books WHERE name = some name AND page = 23 limit"

기본 함수 인수의 올바른 사용 방법은 다음과 같습니다.

function getData($name, $page = '1', $limit = '50') {
    return "Select * FROM books WHERE name = $name AND page = $page limit $limit";
}

echo getData('some name', '23');  // works as expected

출력은 다음과 같습니다.

"Select * FROM books WHERE name = some name AND page = 23 limit 50"

기본값이 아닌 변수 뒤에 기본값을 놓으면 해당 변수가 정의되지 않았거나 지정되지 않은 경우 해당 변수의 기본값이 항상 재설정됩니다.여기에서는 참조용 링크와 이러한 예가 어디서 왔는지 확인할 수 있습니다.

" "로 설정: "로 설정null다른 사람들이 제안하듯이, 다른 대안으로 효과가 있을 수 있지만, 당신이 원하는 것을 만족시키지 못할 수도 있습니다.정의되지 않은 경우 기본값은 항상 null로 설정됩니다.

생략된 파라미터의 경우(필요에 따라) 안전한 곳에 두기 위해 기본 파라미터를 사용합니다.

(기본 파라미터가 " 또는 그와 유사한 경우 또는 그 반대인 경우 null로 설정하면 문제가 발생합니다.)

위에서 설명한 바와 같이 파라미터를 건너뛸 수 없습니다.이 답변은 부록을 제공하기 위해 작성했습니다만, 너무 커서 코멘트에 넣을 수 없습니다.

@Frank Noke는 기본 파라미터로 함수를 호출할 것을 제안합니다.예를 들어, 예를 들어,

function a($b=0, $c=NULL, $d=''){ //...

를 사용해야 합니다.

$var = a(0, NULL, 'ddd'); 

으로는 앞의두 개를 하는 것과 .$b ★★★★★★★★★★★★★★★★★」$c의 파라미터 파라미터입니다.

것이 디폴트인지 하지 않다( 「 」 「 」 「 」 「 」 「 」 「 。0를 입력해 디폴트값을 지정합니다.★★★★★★★★★★★★★★★★★★★★★)

또한 디폴트값이 함수(또는 메서드) 작성자에 의해 변경될 수 있는 경우 디폴트값 문제가 외부(또는 삽입) 함수에 연결될 수 있습니다.따라서 프로그램에서 콜을 변경하지 않으면 콜의 동작이 의도하지 않게 변경될 수 있습니다.

상수를 수예: 글로벌 상수를 정의할 수 있습니다.DEFAULT_A_B다음과 같이 "기능 A의 B 파라미터 기본값" 및 "omit" 파라미터가 됩니다.

$var = a(DEFAULT_A_B, DEFAULT_A_C, 'ddd');

클래스의 경우 클래스 상수는 글로벌 범위의 일부이므로 클래스 상수를 정의하면 더 쉽고 우아합니다.

class MyObjectClass {
  const DEFAULT_A_B = 0;

  function a($b = self::DEFAULT_A_B){
    // method body
  }
} 
$obj = new MyObjectClass();
$var = $obj->a(MyObjectClass::DEFAULT_A_B); //etc.

이 디폴트 상수는 코드 전체에 걸쳐 정확하게1회 정의되므로(메서드 선언에도 값은 없습니다), 예기치 않은 변경이 있을 경우 항상 올바른 디폴트값을 사용하여 함수/메서드를 지정합니다.

이 기본값(예: raw defaults을 지정하는 합니다.NULL,0독자에게 아무 말도 하지 않는 등).

(동감합니다.$var = a(,,'ddd');가장 좋은 옵션입니다.)

인수를 건너뛸 수 없지만 배열 매개 변수를 사용할 수 있으며 매개 변수 배열인 매개 변수를 하나만 정의해야 합니다.

function myfunction($array_param)
{
    echo $array_param['name'];
    echo $array_param['age'];
    .............
}

필요한 만큼 파라미터를 추가할 수 있으므로 정의할 필요가 없습니다.함수를 호출할 때 다음과 같이 파라미터를 입력합니다.

myfunction(array("name" => "Bob","age" => "18", .........));

이 기능은 PHP 8.0에 구현되어 있습니다.

PHP 8은 명명된 인수를 도입했습니다.

이 경우:

임의로 기본값을 건너뛸 수 있습니다.

참고 자료

이 기능을 사용하기 위해 변경할 필요가 없습니다.

OPS 기능을 사용합시다.function getData($name, $limit = '50', $page = '1')

사용.

getData(name: 'some name', page: '23');

네이티브 기능에서도 이 기능을 사용합니다.

htmlspecialchars($string, double_encode: false);
// Same as
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

지원되는 Netbeans IDE 12.3 기능

이 기능은 이름 있는 인수의 코드 완성을 제외하고 지원되고 있습니다.

여기에 이미지 설명 입력

이것은 기술적으로 유능한 답변이 많은 오래된 질문이지만, PHP의 현대적인 디자인 패턴 중 하나인 객체 지향 프로그래밍을 필요로 합니다.원시 스칼라 데이터 유형의 컬렉션을 주입하는 대신 함수에 필요한 모든 데이터를 포함하는 "injected-object" 사용을 고려하십시오.http://php.net/manual/en/language.types.intro.php

삽입된 개체에는 속성 확인 루틴 등이 있을 수 있습니다.주입된 객체에 대한 데이터의 인스턴스화 및 주입이 모든 검증을 통과할 수 없는 경우 코드는 즉시 예외를 발생시킬 수 있으며 애플리케이션은 잠재적으로 불완전한 데이터를 처리하는 어색한 프로세스를 피할 수 있습니다.

삽입된 오브젝트를 타이핑하여 전개 전에 오류를 검출할 수 있습니다.몇 가지 아이디어는 몇 년 전의 이 기사에 요약되어 있습니다.

https://www.experts-exchange.com/articles/18409/Using-Named-Parameters-in-PHP-Function-Calls.html

옵션 파라미터를 사용하여 Factory를 작성해야 했습니다.이 문제를 해결하려면 null mergeing 연산자를 사용합니다.

public static function make(
    string $first_name = null,
    string $last_name = null,
    string $email = null,
    string $subject = null,
    string $message = null
) {
    $first_name = $first_name ?? 'First';
    $last_name  = $last_name ?? 'Last';
    $email      = $email ?? 'foo@bar.com';
    $subject    = $subject ?? 'Some subject';
    $message    = $message ?? 'Some message';
}

사용방법:

$factory1 = Factory::make('First Name Override');
$factory2 = Factory::make(null, 'Last Name Override');
$factory3 = Factory::make(null, null, null, null 'Message Override');

가장 예쁜 것은 아니지만 공장에서 테스트하기 좋은 패턴일 수 있습니다.

다른 모든 사람들이 이미 말했듯이, 당신이 원하는 것은 함수에 코드 라인을 추가하지 않고는 PHP에서 가능하지 않을 것입니다.

그러나 이 코드를 함수의 맨 위에 배치하면 기능을 얻을 수 있습니다.

foreach((new ReflectionFunction(debug_backtrace()[0]["function"]))->getParameters() as $param) {
    if(empty(${$param->getName()}) && $param->isOptional())
        ${$param->getName()} = $param->getDefaultValue();
}

기본적으로는 이 코드가 배치되어 있는 함수명을 취득하여 새로운 객체를 만들고 모든 함수 인수를 루프합니다.

루프에서는 단순히 function 인수가 "optional"인지 확인하고 인수도 "optional"인지 확인합니다(기본값이 있음을 의미합니다).yes의 경우 인수에 기본값을 할당합니다.

Demo

제한을 null로 설정합니다.

function getData($name, $limit = null, $page = '1') {
    ...
}

그 함수를 호출합니다.

getData('some name', null, '23');

제한을 설정하고 싶다면 인수로 넘길 수 있습니다.

getData('some name', 50, '23');

앞서 알려드린 바와 같이 변경된 것은 없습니다.단, 너무 많은 파라미터(특히 옵션 파라미터)는 코드 냄새의 강력한 지표입니다.

기능이 너무 많은 것 같습니다.

// first build context
$dataFetcher->setPage(1);
// $dataFetcher->setPageSize(50); // not used here
// then do the job
$dataFetcher->getData('some name');

일부 파라미터는 논리적으로 그룹화할 수 있습니다.

$pagination = new Pagination(1 /*, 50*/);
getData('some name', $pagination);
// Java coders will probably be familiar with this form:
getData('some name', new Pagination(1));

마지막 방법에서는 항상 애드혹파라미터 오브젝트를 도입할 수 있습니다.

$param = new GetDataParameter();
$param->setPage(1);
// $param->setPageSize(50); // not used here
getData($param);

(이것은 형식적이지 않은 파라미터 배열 기술의 미화된 버전일 뿐입니다)

경우에 따라서는 파라미터를 옵션으로 하는 이유 자체가 잘못되어 있을 수 있습니다.예에서 는 " " 입니다.$page말말선 선택? ???몇 개의 캐릭터를 저장하는 것이 실제로 차이를 만드는가?

// dubious
// it is not obvious at first sight that a parameterless call to "getData()"
// returns only one page of data
function getData($page = 1);

// this makes more sense
function log($message, $timestamp = null /* current time by default */);

다음 토막:


함수 getData($name, $options) {$default = 어레이()'한계' => 50,'페이지' => 2,);$sqs = array_sqsdefault, $sqd);
print_rs);}
getData('foo', array());
getData('foo', array'limit'=>2);
getData('foo', array'limit'=>10, 'page'=>10);

답변은 다음과 같습니다.


어레이([한계] => 50[페이지] => 2)어레이([한계] => 2[페이지] => 2)어레이([한계] => 10[페이지] => 10)

나는 이렇게 할 것이다.

<?php

    function getData($name, $limit = '', $page = '1') {
            $limit = (EMPTY($limit)) ? 50 : $limit;
            $output = "name=$name&limit=$limit&page=$page";
            return $output;
    }

     echo getData('table');

    /* output name=table&limit=50&page=1 */

     echo getData('table',20);

    /* name=table&limit=20&page=1 */

    echo getData('table','',5);

    /* output name=table&limit=50&page=5 */

    function getData2($name, $limit = NULL, $page = '1') {
            $limit = (ISSET($limit)) ? $limit : 50;
            $output = "name=$name&limit=$limit&page=$page";
            return $output;
    }

    echo getData2('table');

    // /* output name=table&limit=50&page=1 */

    echo getData2('table',20);

    /* output name=table&limit=20&page=1 */

    echo getData2('table',NULL,3);

    /* output name=table&limit=50&page=3 */

?>

이것이 누군가에게 도움이 되기를 바란다.

PHP 8.0.0에서는 옵션 인수 뒤에 필수 인수를 선언하는 것은 권장되지 않습니다.

이제 선택적 매개 변수를 생략할 수 있습니다.

예:

<?php

function foo ( $a = '1', $b = '2', $c = '3'  ){
   return "A is " . $a . ", B is " . $b . ", C is " . $b  
}

echo foo(c: '5');  
// Output A is 1, B is 2, C is 5

이것을 시험해 보세요.

function getData($name, $limit = NULL, $page = '1') {
               if (!$limit){
                 $limit = 50;
               }
}

getData('some name', '', '23');

함수 호출에서는 중간 파라미터를 생략할 수 없습니다.단, 다음과 같이 대처할 수 있습니다.

function_call('1', '2', '3'); // Pass with parameter.
function_call('1', null, '3'); // Pass without parameter.

기능:

function function_call($a, $b='50', $c){
    if(isset($b)){
        echo $b;
    }
    else{
        echo '50';
    }
}

@Ibrahim Lawal 。그냥 로 설정하는 것이 가장 좋습니다.null가치.전달된 값이 다음 값인지 확인합니다.null이치노

<?php
define('DEFAULT_LIMIT', 50);
define('DEFAULT_PAGE', 1);

function getData($name, $limit = null, $page = null) {
    $limit = is_null($limit) ? DEFAULT_LIMIT : $limit;
    $page = is_null($page) ? DEFAULT_PAGE : $page;
    ...
}
?>

이게 도움이 됐으면 좋겠다.

getData('some name');

전달하지 않으면 기본값이 허용됩니다.

언급URL : https://stackoverflow.com/questions/1066625/how-would-i-skip-optional-arguments-in-a-function-call

반응형