Как выполнить явный вызов встроенной функции chr (), когда параметр 'needle', переданный во встроенную функцию strpos (), не является строкой? - PullRequest
0 голосов
/ 22 апреля 2019

Я использую PHP 7.3.4 на своем домашнем компьютере, работающем на 64-разрядная операционная система Windows 10 Home Single Language

Я установил последнюю версию установщика ox XAMPP на эту машину.

Сегодня я натолкнулся на следующий текст из PHP Manual :

игла

Если игла не является строкой, она преобразуется в целое число и применяется в качестве порядкового значения символа. Такое поведение устарел, начиная с PHP 7.3.0, и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения игла должна быть либо явное приведение к строке или явный вызов chr () должен быть производится.

Из вышеприведенного утверждения я очень хорошо понял, что если параметр 'needle' , переданный во встроенную функцию strpos(), не является строкой , я должен явно привести это строка , но я не понимаю, как выполнить явный вызов встроенной функции chr(), когда параметр 'needle' передан во встроенную функцию strpos() не является строкой .

Поскольку я использую последнюю стабильную версию PHP, то есть PHP 7.3.4 , я хочу пример рабочего кода , специфичный для PHP 7.3.x версия, которая продемонстрирует, как явный вызов встроенной функции chr() выполняется, когда параметр 'needle', передаваемый во встроенную функцию strpos(), не является строкой .

Было бы лучше, если бы кто-нибудь также предоставил мне пример рабочего кода, который продемонстрирует, если параметр 'needle' , переданный во встроенную функцию strpos(), не является строкой как явно привести его к string .

Короче, мне нужны два примера рабочего кода, демонстрирующие текст руководства .

Спасибо.

1 Ответ

4 голосов
/ 22 апреля 2019
$vs = [42, '42'];
foreach ($vs as $v) {
    var_dump(
        strpos('zz*z', is_string($v) ? $v : chr($v)),
        strpos('zz42z', (string)$v)
    );
}

Выход:

int(2)       // chr of 42 is "*"
int(2)       // casting 42 to string gives you "42"
bool(false)  // There's no "42" in first string
int(2)       // casting string "42" to string still gives you a string "42"

В php7.2 и более ранних версиях:

var_dump(
    strpos('zz*z', 42),
    strpos('zz42z', 42)
);

Выход:

int(2)        // 42 implicitly converted to "*"
bool(false)   // 42 implicitly converted to "*"

В php 7.3 вы получите те же результаты , но с предупреждением:

Устаревшее: strpos(): Неструйные иглы будут интерпретироваться как строки в будущем. Используйте явный вызов chr(), чтобы сохранить текущее поведение в / .. on line ..

...