펄에서 이런 종류의 일을 사랑 : $foo = $bar || $baz
할당 $baz
에 $foo
경우 $bar
비어 있거나 정의되지 않습니다. 또한이 $foo ||= $bletch
단지 지정되는 $bletch
에 $foo
있는 경우$foo
정의되지 않았거나 비어 있지 않은 .
이 상황에서 삼항 연산자는 지루하고 지루합니다. PHP에서 간단하고 우아한 방법을 사용할 수 있습니까?
아니면 유일한 대답은 isset ()을 사용하는 사용자 정의 함수입니까?
답변
PHP 7에서는 마침내이를 우아하게 처리 할 수있는 방법이 있습니다. 이를 Null 통합 연산자 라고합니다 . 다음과 같이 사용할 수 있습니다.
$name = $_GET['name'] ?? 'john doe';
이것은
$name = isset($_GET['name']) ? $_GET['name']:'john doe';
답변
PHP 5.3에는 속기 ?:
연산자가 있습니다.
$foo = $bar ?: $baz;
$bar
빈 값이 아닌 경우 할당 합니다 (PHP에서 Perl과 어떻게 다른지 모르겠습니다). 그렇지 않으면 $baz
Perl 및 이전 버전의 PHP에서와 동일합니다.
$foo = $bar ? $bar : $baz;
그러나 PHP에는 이에 대한 복합 할당 연산자가 없습니다 (즉, Perl과 동일하지 않음 ||=
).
또한, $bar
알림을 끄지 않으면 PHP가 설정되어 있지 않으면 소리 가납니다. 사이의 의미 적 차이도있다 isset()
하고 empty()
. 변수가 존재하지 않거나로 설정된 경우 전자는 false를 반환합니다 NULL
. 사실 후자의 반환은 존재하지 않는, 또는로 설정되어있는 경우 0
, ''
, false
또는 NULL
.
답변
모든 위대한 답변에 감사드립니다!
가능한 대안을 찾기 위해 여기에 오는 다른 사람들을 위해, 이런 종류의 것들에서 지루한 것을 제거하는 데 도움이되는 몇 가지 기능이 있습니다.
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.
부울 컨텍스트에서 평가할 수있는 값에 적용됩니다. 여기서 장점은 변수가 정의되지 않은 경우 디버그 e_notice를 제공한다는 것입니다.
답변
7. * 이전의 PHP에서는 다음과 같이 로컬에 오류가 표시되지 않은 정의되지 않은 변수에? :를 사용할 수 있습니다 @
.
$foo = @$bar ?: $baz;
답변
이것은 isset
경우에 대한 또 다른 좋은 형식입니다
isset($foo) || $foo= $bar;
또 다른 간단한 방법으로 더 많은 조건을 추가하고 동시에 다른 변수에 할당 할 수 있으므로 더 많은 제어 기능을 제공합니다
$foo = (isset($oData['foo']))?$bar['foo']:'default value';
답변
가능한 해결책 : defaultFor ()
우리가 팩토리 솔루션을 가지고 있지 않는 한 (실제로 성가신) 다음의 작은 도우미를 추천합니다. 대부분의 경우 작업을 수행합니다.
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 또는 다른 것과 같은 두 번째 매개 변수로 무거운 것을 사용하지 마십시오. 그러한 경우, 당신은 isseting을 사용하는 것이 좋습니다.