programing

변수를 기본값으로 설정하는 최선의 방법(예: Perl ||, |= )

javaba 2022. 11. 5. 11:18
반응형

변수를 기본값으로 설정하는 최선의 방법(예: Perl ||, |= )

저는 Perl에서 이런 일을 하는 것을 좋아합니다.$foo = $bar || $baz할당하다$baz로.$foo한다면$bar비어 있거나 정의되어 있지 않습니다.또,$foo ||= $bletch이것은 단지 할당될 수 있는 것은$bletch로.$foo한다면$foo정의되지 않았거나 비어 있지 않습니다.

이 상황에서 삼원 연산자는 지루하고 귀찮다.PHP에서 사용할 수 있는 심플하고 우아한 방법은 없을까?

아니면 isset()을 사용하는 커스텀 함수가 유일한 답변입니까?

PHP 5.3에는 약어가 있습니다.?:연산자:

$foo = $bar ?: $baz;

어느 쪽이 할당됩니까?$bar빈 값이 아닌 경우(PHP에서 Perl과 어떻게 다른지 모르겠습니다), 그렇지 않은 경우$bazPerl 및 이전 버전의 PHP에서는 다음과 같습니다.

$foo = $bar ? $bar : $baz;

그러나 PHP에는 이를 위한 복합 할당 연산자가 없습니다(즉, Perl과 동등한 연산자는 없습니다).||=).

또, PHP는, 다음의 경우에 노이즈를 발생시킵니다.$bar알림을 끄지 않으면 설정되지 않습니다.또한 의의적인 차이가 있다.isset()그리고.empty()변수가 존재하지 않거나 로 설정된 경우 전자는 false를 반환합니다.NULL. 후자는 존재하지 않거나 로 설정된 경우 true를 반환합니다.0,'',false또는NULL.

PHP 7에서는 드디어 우아하게 할 수 있는 방법이 등장했습니다.이를 Null 병합 연산자라고 합니다.다음과 같이 사용할 수 있습니다.

$name = $_GET['name'] ?? 'john doe';

이것은 에 상당합니다.

$name = isset($_GET['name']) ? $_GET['name']:'john doe';

좋은 답변 감사합니다!

또 다른 대안으로 여기 오시는 분들을 위해 몇 가지 기능이 있습니다.이러한 기능들은 지루함을 없애기 위한 것입니다.

function set_if_defined(&$var, $test){
    if (isset($test)){
        $var = $test;
        return true;
    } else {
        return false;
    }
}

function set_unless_defined(&$var, $default_var){
    if (! isset($var)){
        $var = $default_var;
        return true;
    } else {
        return false;
    }
}

function select_defined(){
    $l = func_num_args();
    $a = func_get_args();
    for ($i=0; $i<$l; $i++){
        if ($a[$i]) return $a[$i];
    }
}

예:

// $foo ||= $bar;
set_unless_defined($foo, $bar);

//$foo = $baz || $bletch
$foo = select_defined($baz, $bletch);

나는 이것들이 개선될 수 있다고 확신한다.

오래된 PHP 버전과의 호환성을 유지하기 위한 일반적인 관용구는 다음과 같습니다.

 $var = $bool   or   $var = "default";
 // If I use it, then only with excessive spaces for clarity.

이는 부울 컨텍스트에서 평가할 수 있는 값에 대해 작동합니다.여기서의 장점은 변수가 정의되지 않은 경우 debug e_notice도 제공된다는 것입니다.

7.* 이전 버전의 PHP에서는 로컬로 억제된 오류가 있는 정의되지 않은 변수에 대해 ?:를 사용할 수 있습니다.@:

$foo = @$bar ?: $baz;

이것은 다른 좋은 포맷입니다.isset사례.

isset($foo) || $foo= $bar;

다른 간단한 방법으로 더 많은 조건을 추가하고 동시에 다른 변수에 할당할 수 있으므로 더 많은 제어가 가능합니다.

$foo = (isset($oData['foo']))?$bar['foo']:'default value';

생각할 수 있는 해결책: default For()

공장에서의 솔루션이 없는 한(매우 귀찮음) 이하의 작은 도우미를 추천합니다.대부분의 경우 다음과 같은 작업을 수행합니다.


    function defaultFor(&$x,$default=null) {
        if(!isset($x)) $x = $default;
    }

    //--------------------  Now you can do this: --------------

    defaultFor($a,"Jack");  // if $a is not set, it will be "Jack"
    defaultFor($x);         // no more notices for $x but keep it !isset

이것이 당신이 달성하고자 하는 것에 가깝기를 바랍니다.존재하지 않는 변수와 함께 사용하면 알림이 표시되지 않고 매우 편리합니다.확실히 단점이 있습니다.기본값은 항상 미리 계산되기 때문에 file_get_contents 등의 무거운 파라미터와 함께 사용하지 마십시오.그런 경우엔 발포를 하는 게 좋을 거예요.

일반적으로 다음과 같은 작업을 수행할 수 있습니다.

$foo = $bar || $baz;

생각입니다만, 만약 그렇지 ,$bar ★★★★★★★★★★★★★★★★★」$baz둘 다 부엉이다.다음 중 하나:

$bar = 10;
$baz = 11;

그러면 질문은 무엇이 진실인지 거짓인지를 결정하는가 하는 것이다.대부분의 사람들은 아마 0이 거짓이고, 다른 모든 것이 진실일 것이라고 예상할 것이다., 를 들어 Ruby)에서는 'Ruby'만 가능합니다.false ★★★★★★★★★★★★★★★★★」nil 다 false)라는 뜻)0 ★★★★★★★★★★★★★★★★★」1랭귀지의 다음의 합니다.이러한 크로스 랭귀지의 애매성 때문에, 다음의 경우는 명확하게 하는 것이 최선이라고 생각합니다.

if ($bar !== 0) {
   $foo = $bar;
} else {
   $foo = $baz;
}

또는 다음과 같이 입력합니다.

$foo = $bar !== 0 ? $bar : $baz;

언급URL : https://stackoverflow.com/questions/5972516/best-way-to-give-a-variable-a-default-value-simulate-perl

반응형