0

join()andの PHP ドキュメントには、 andは文字列でなければならないとexplode()書かれています。私はこれを試しましたが、エラーは発生しません:$glue$delimiter

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

したがって、or$varとして使用できる a をチェックしている場合 、条件として安全に使用できますか、それとも or からエラーが発生する可能性がありますか?$glue$delimiteris_string($var) || is_numeric($var)truejoin()explode()

4

3 に答える 3

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'));

いずれにせよ、彼らはとにかく変換​​されているようです。

それでも、たとえばオブジェクトが渡された場合に、キャッチ可能な致命的なエラーを使用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)) { // ...
于 2011-11-29T07:57:38.437 に答える
1

PHP は、実際に結合を実行する前に文字列への暗黙的なキャストを実行します (implodeよりクールに聞こえるため、そうする必要があります)。__toString()マジック関数も定義されているクラスを使用することもできます。整数はいつでも文字列にキャストできるので、問題はないはずです。

ただし、次のようにする方がよい場合もあります。

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

実際に文字列かどうかを確認します。:)

于 2011-11-29T08:04:44.070 に答える
0

マニュアルでは、$glue と $delimiter が文字列である必要があるとは決して述べていません。文字列操作
の明らかな型である型について言及しているだけです。 そして、他の型はこの型にキャストされるだけです。これは、PHP でどこでも使用されているものであり、大したことではありません。

すべての文字列演算子は、その引数を文字列にキャストします - 理解できません。なぜここで疑問に思うのでしょうか。
たとえば、TRUE.TRUEブール値を文字列にもキャストします。

安全に使用できますis_string($var) || is_numeric($var)

私はそのようなチェックにまったく意味がないと思います。

于 2011-11-29T08:35:35.797 に答える