변수를 기본값으로 설정하는 최선의 방법(예: Perl ||, |= )
저는 Perl에서 이런 일을 하는 것을 좋아합니다.$foo = $bar || $baz
할당하다$baz
로.$foo
한다면$bar
비어 있거나 정의되어 있지 않습니다.또,$foo ||= $bletch
이것은 단지 할당될 수 있는 것은$bletch
로.$foo
한다면$foo
정의되지 않았거나 비어 있지 않습니다.
이 상황에서 삼원 연산자는 지루하고 귀찮다.PHP에서 사용할 수 있는 심플하고 우아한 방법은 없을까?
아니면 isset()을 사용하는 커스텀 함수가 유일한 답변입니까?
PHP 5.3에는 약어가 있습니다.?:
연산자:
$foo = $bar ?: $baz;
어느 쪽이 할당됩니까?$bar
빈 값이 아닌 경우(PHP에서 Perl과 어떻게 다른지 모르겠습니다), 그렇지 않은 경우$baz
Perl 및 이전 버전의 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
'programing' 카테고리의 다른 글
InnoDB: redo 로그가 참조하므로 공백 ID가 26146인 데이터 파일 '.catalog_category_product_index_store1.ibd'를 무시합니다. (0) | 2022.11.05 |
---|---|
다중 열 기본 키의 NULL 값 (0) | 2022.11.05 |
타임스탬프부터 일별 그룹화 (0) | 2022.11.05 |
뷰를 사용하여 현재 Laravel 버전을 php로 에코하려면 어떻게 해야 합니까? (0) | 2022.11.05 |
.vue 파일에서 NPM 패키지를 작성하는 방법 (0) | 2022.11.05 |