2011-11-29 8 views
0

join()explode()에 대한 PHP 문서는 $glue$delimiter이 문자열이어야한다고 말합니다. 나는 이것을 시도하고 오류가 발생하지 않습니다 내가 $glue 또는 $delimiter로 사용할 수있는 $var을 확인하고있어 경우에 따라서, 다음 안전 조건으로 is_string($var) || is_numeric($var) 를 사용되거나하는 것입니다글씨와 구분 기호로 숫자를 사용 하시겠습니까?

$glue = -8.5; 
$delimiter = 0; 
echo join($glue, explode($delimiter, '1_0_1')); // '1_-8.5_1' 

이 시간은 true 일 수 있지만 join() 또는 explode()에서 오류가 발생합니다.

+0

오류가 표시되지 않는다고해서 실제로 허용해야한다는 의미는 아닙니다. – kapa

+0

@bazmegakapa하지만 오류가 발생하지 않으면 왜 안전하지 않습니까? – ryanve

+0

우리는 글루와 구분 기호에 대해 이야기하고 있습니다 ...이 경우에만 문자열을 허용하는 것이 완벽합니다. – kapa

답변

2

당신은 다음과 같이 캐스팅 입력 할 수 있습니다 : 어떤 속도에서

// note join() is just an alias for implode. 
// i like the symmetry of using implode/explode 
echo implode((string) $glue, explode((string) $delimiter, '1_0_1')); 

, 그들이 어쨌든 변환되고 있었다 나타납니다.

그래도 개체가 전달되면 catch 가능 치명적인 오류가 발생하지 않도록하려면 is_string()is_numeric()을 사용하는 것이 좋습니다.

if ((is_string($glue) || is_numeric($glue)) 
    && (is_string($delimiter) || is_numeric($delimiter)) 
) { 
    // objects didn't pass the test, safe to type-cast 
    echo implode((string) $glue, explode((string) $delimiter, '1_0_1')); 
} 

편집 ryanve의 제안 당

, 당신도이 작업을 수행 할 수 있습니다 :

if (is_scalar($glue) && !is_bool($glue)) { // ... 
+0

Thx // 네, 캐스팅 연산을 사용하고 싶지 않았습니다. 배열이나 객체가 전달되면 'Array'또는 'Object'를 접착제/구분 기호로 사용하려고했기 때문입니다. – ryanve

+1

또한'(string) false'가 'Empty delimiter'오류를 던지고'((string) true '가''1'이된다는 것을 제외하고는 거의 is_scalar()를 사용할 수 있습니다. – ryanve

+0

@ryanve touche. 아마도'is_scalar ($ var) && false! == $ var'와 같은 것이 해결책이 될 것입니다. –

1

PHP 실제로 가입하기 전에 문자열에 대한 암시 적 캐스트를 수행한다 (해야한다 implode 소리가 나기 때문에). 심지어 __toString() 마법 함수가 정의 된 클래스를 사용할 수도 있습니다. 정수는 항상 문자열로 캐스트 될 수 있으므로 아무런 문제가 없어야합니다.

비록, 그것을 할 더 나은 수 있습니다 : 실제로 문자열 인 경우

try { 
    $var = (string)$var; 
} 
catch(Exception $e) { 
    echo "oh, noes, it wasn't castable to a string!"; 
} 

확인하십시오. :)

+0

__toString은 예외를 throw 할 수 없습니다. 어쨌든 잡을 수있는 사람이 아닙니다.) –

+0

정확합니다. 나는 복구 가능한 모든 오류 조건을 예외로 변환하는데 너무 익숙하다. :) – mikn

+0

그래, 나도 그 때문에 내가 그것에 부딪쳤다. :) –

0

매뉴얼에서는 $ 글루와 $ 구분 기호가 문자열이어야한다고 말한 적이 없습니다.
문자열 조작에 대한 명백한 유형 인 유형 만 언급하면됩니다.
그리고 다른 유형은이 유형으로 캐스팅 될 것입니다. PHP에서 사방별로 사용되는 것이지 큰 문제는 아닙니다.

모든 문자열 연산자는 문자열을 인수로 캐스팅합니다. 이해가 안되는 이유는 무엇입니까?
라고 말하면 TRUE.TRUE은 부울을 문자열에도 캐스트합니다.

는 안전

is_string($var) || is_numeric($var) 나는 전혀 그런 검사에서 어떤 점을 볼 사용할 수 있습니다.

관련 문제