스위치 사용 === 비교 == 비교 PHP에서
어쨌든 다음 코드가 여전히 스위치를 사용하고 반환 b
하지 않도록 만들 수 a
있습니까? 감사!
$var = 0;
switch($var) {
case NULL : return 'a'; break;
default : return 'b'; break;
}
물론 if 문을 사용하면 다음과 같이 할 수 있습니다.
$var = 0;
if($var === NULL) return 'a';
else return 'b';
그러나 더 복잡한 예의 경우 이것은 장황 해집니다.
죄송합니다 ===
. switch () 문서 에 따르면 switch 문에서 비교를 사용할 수 없습니다 .
스위치 / 케이스는 느슨한 비교를 수행합니다.
즉, 해결 방법을 찾아야합니다. 에서 느슨한 비교 테이블 , 당신은 사실의 사용을 만들 수있는 NULL == "0"
타입 캐스팅은 false입니다 :
<?php
$var = 0;
switch((string)$var)
{
case "" : echo 'a'; break; // This tests for NULL or empty string
default : echo 'b'; break; // Everything else, including zero
}
// Output: 'b'
?>
아니 switch
-소위 "느슨한"비교 만 수행합니다. 을 if/else if
사용하여 언제든지 블록으로 바꿀 수 있습니다 ===
.
- 스위치 문서 : http://php.net/manual/en/control-structures.switch.php
- 느슨한 비교 : http://php.net/manual/en/types.comparisons.php#types.comparisions-loose
다음은 "엄격한"switch 문에있는 원본 코드입니다.
switch(true) {
case $var === null:
return 'a';
default:
return 'b';
}
다음과 같이 더 복잡한 switch 문을 처리 할 수도 있습니다.
switch(true) {
case $var === null:
return 'a';
case $var === 4:
case $var === 'foobar':
return 'b';
default:
return 'c';
}
아마도 당신은 변수를 켜고 정수를 기대하고 있습니다. 을 사용하여 변수의 정수 상태를 미리 확인하는 것은 is_int($val)
어떻습니까?
숫자가 포함 된 문자열이있는 스위치에서 동일한 문제가 발생했습니다 ( "15.2"는 PHP 용 스위치에서 "15.20"과 같습니다).
비교할 텍스트 앞에 문자를 추가하는 문제를 해결했습니다.
$var = '15.20';
switch ('#'.$var) {
case '#15.2' :
echo 'wrong';
break;
case '#15.20' :
echo 'right';
break;
}
스위치 사용 === 비교 == 비교 PHP에서
불행히도 switch
느슨한 비교를 사용하며 내가 아는 한 그것을 변경할 방법이 없습니다.
PHP의 Switch 문은 느슨한 비교 만 수행합니다 (==) http://www.php.net/manual/en/control-structures.switch.php 참조
엄격한 비교가 필요한 경우 if / elseif / else를 사용하십시오.
난 그냥 사용
$var === null and $var = -1; // since switch is not type-safe
switch ( $var ) {
case 0:
# this tests for zero/empty string/false
break;
case -1:
# this tests for null
break;
}
로 시작하는 주석 //
이 남겨진 경우 (그리고로 시작하는 주석 #
이 아마도 가장 잘 삭제 된 경우) 이것은 여전히 매우 읽기 쉬운 것 같습니다.
아니. 로부터 매뉴얼 페이지 :
스위치 / 케이스는 느슨한 비교를 수행 합니다.
두 가지 조건 만있는 경우 두 if
번째 예제와 같은 것을 사용 하십시오. 그렇지 않으면 NULL
먼저 확인 하고 다른 가능성을 켜십시오.
if (is_null($var))
{
return 'a';
}
switch ($var)
{
// ...
}
예제 코드에서 외삽하면 많은 일반 사례와 하나의 특수 사례가 있다고 생각합니다 (여기, null
).
내가 알아낼 수있는 가장 간단한 방법은 전환 전에이 케이스를 처리하는 것입니다.
if ($value === null) {
return 'null';
}
switch ($value) {
case 0:
return 'zero';
case 1:
return 'one';
case 2:
return 'two';
}
기억할 주석을 추가하면 null
예상치 않게 0
케이스 와 일치 할 수 있습니다 (반대로 케이스 0
와 일치 함 null
).
이건 불가능 해.
그러나 다음과 같은 내부 에 if
명령문을 넣을 수 있습니다 .switch
switch($var) {
// Loose cases here
case 0:
if($var === NULL) {
return 'a';
}
// Fall through
default:
return 'b';
}
또는 간단히 :
switch($var) {
// Loose cases here
default:
if($var === NULL) {
return 'a';
}
return 'b';
}
변수 유형을 켤 수도 있습니다.
switch (gettype($var)) {
...
}
가장 좋은 방법 중 하나는 다음을 사용하여 NULL 값을 확인하는 것입니다. is_null
<?php
echo getValue();
function getValue()
{
$var = 0;
switch(true) {
case is_null($var) : return 'a'; break;
default : return 'b'; break;
}
}
?>
어설 션과 같은 클래스를 만들고 원하는 로직을 넣으십시오. "true"메서드가 반환되는 한 $this
(그리고 거짓 긍정을 피하기위한 다른 것은 없습니다.)
class Haystack
{
public $value;
public function __construct($value)
{
$this->value = $value;
}
public function isExactly($n)
{
if ($n === $this->value)
return $this;
}
}
$var = new Haystack(null);
switch ($var) {
case $var->isExactly(''):
echo "the value is an empty string";
break;
case $var->isExactly(null):
echo "the value is null";
break;
}
또는 스위치를 실제 클래스에 넣을 수 있습니다.
class Checker
{
public $value;
public function __construct($value)
{
$this->value = $value;
}
public function isExactly($n)
{
if ($n === $this->value)
return $this;
}
public function contains($n)
{
if (strpos($this->value, $n) !== false)
return $this;
}
public static function check($str)
{
$var = new self($str);
switch ($var) {
case $var->isExactly(''):
return "'$str' is an empty string";
case $var->isExactly(null):
return "the value is null";
case $var->contains('hello'):
return "'$str' contains hello";
default:
return "'$str' did not meet any of your requirements.";
}
}
}
var_dump(Checker::check('hello world')); # string(28) "'hello world' contains hello"
Of course that that point you might want to re-evaluate what you want to do with what you're checking and use a real validation library instead.
If you want to test both value and type of your variable, then build a new string variable containing both informations and compare it with your different scenarios (by concatenation) it should work for your case if you implement all possible types (according to gettype() documentation), example :
<?php
$var= 9999;
$valueAndTypeOfVar = (string)$var.' '.gettype($var);
switch($valueAndTypeOfVar) {
case "$var boolean" : echo 'a'; break;
case "$var integer" : echo 'b'; break;
case "$var double" : echo 'c'; break;
case "$var string" : echo 'd'; break;
case "$var array" : echo 'e'; break;
case "$var object" : echo 'f'; break;
case "$var resource" : echo 'g'; break;
case "$var NULL" : echo 'h'; break;
case "$var unknown type" : echo 'i'; break;
default: echo 'j'; break;
}
// Outputs: 'b'
?>
참고URL : https://stackoverflow.com/questions/3525614/make-switch-use-comparison-not-comparison-in-php
'developer tip' 카테고리의 다른 글
java.util.Date 형식 변환 yyyy-mm-dd에서 mm-dd-yyyy로 (0) | 2020.11.03 |
---|---|
로그 슬라이더 (0) | 2020.11.03 |
ASP.NET MVC 용 플러그인 아키텍처 (0) | 2020.11.02 |
JUnit 4에서 특정 카테고리에 속하는 모든 테스트를 실행하는 방법 (0) | 2020.11.02 |
Visual Studio 코드 서식이 Razor 태그에 대해 제대로 작동하지 않는 이유는 무엇입니까? (0) | 2020.11.02 |