Хорошо, чтобы использовать числа в качестве клея и разделителей? - PullRequest
0 голосов
/ 29 ноября 2011

Документы PHP для join() и explode() говорят, что $glue и $delimiter должны быть строками.Я попробовал это, и он не выдает никаких ошибок:

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

Так что, если я проверяю $var, который можно использовать как $glue или $delimiter, то безопасно ли это использоватьis_string($var) || is_numeric($var) в качестве условия ИЛИ есть ли моменты, когда это может быть true, но может быть ошибка из join() или explode()?

Ответы [ 3 ]

2 голосов
/ 29 ноября 2011

Вы можете просто выполнить приведение типа следующим образом:

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

Редактировать

По предложению Райанве, вы тоже можете сделать это:

if (is_scalar($glue) && !is_bool($glue)) { // ...
1 голос
/ 29 ноября 2011

PHP выполняет неявное приведение к строке перед выполнением объединения (что должно быть implode, поскольку это звучит круче). Вы даже можете использовать класс, в котором также определена магическая функция __toString(). Целое число всегда можно привести к строке, поэтому проблем не должно быть, нет.

Хотя, может быть, еще лучше сделать:

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

Чтобы проверить, действительно ли это строка. :)

0 голосов
/ 29 ноября 2011

Руководство никогда не говорит, что $ glue и $ delimiter "должны" быть строками.
Здесь просто упоминается тип, очевидный тип для манипуляции string .
И другие типы будут просто приводиться к этому типу - вещь, используемая в PHP повсеместно, не имеет большого значения.

Каждый строковый оператор будет приводить свои аргументы к строкам - я не понимаю, что вас здесь удивляет.
скажем, TRUE.TRUE будет также приводить логические значения к строкам.

безопасно использовать is_string($var) || is_numeric($var)

Я вообще не вижу смысла в такой проверке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...