Нужен пример рабочего кода, где не строковое значение передается в параметре $ needle функции strpos () - PullRequest
0 голосов
/ 16 ноября 2018

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

Я сталкивался сСтраница справочника Параметр иглы функции strpos ()

Там он записан как

игла

Если игла не является строкой, она преобразуется в целое число и применяется в качестве порядкового значения символа.

Я не понял значения приведенного выше утверждения о игла параметр.

Может кто-нибудь объяснить, пожалуйста, значение утверждения о параметре needle из руководства по PHP вместе с примером рабочего кода, в котором в параметре $ needle, равном * 1029, передается нестроковое значениеФункция * strpos () .

Как выполняется преобразование в целое число типа и как оно применяется в качестве порядкового значения символа?

Я не смог найти такого примера нигде в руководстве или на любом другом веб-сайте.

Было бы лучше, если бы также был предоставлен рабочий пример кодирования вместе с параметром смещения.

Спасибо.

1 Ответ

0 голосов
/ 16 ноября 2018
$haystack = "maio290";
$needle = ord("a");

var_dump(strpos($haystack,$needle));

Выходы: int(1)

Почему? Порядковый номер символа равен числу, которое вы можете найти в нескольких таблицах ASCII. Например, символ «а» равен целому числу 97.

Вот исходный код PHP (или материал, который вам необходим для понимания функции strpos):

static int php_needle_char(zval *needle, char *target)
{
    switch (Z_TYPE_P(needle)) {
        case IS_LONG:
            *target = (char)Z_LVAL_P(needle);
            return SUCCESS;
        case IS_NULL:
        case IS_FALSE:
            *target = '\0';
            return SUCCESS;
        case IS_TRUE:
            *target = '\1';
            return SUCCESS;
        case IS_DOUBLE:
            *target = (char)(int)Z_DVAL_P(needle);
            return SUCCESS;
        case IS_OBJECT:
            *target = (char) zval_get_long(needle);
            return SUCCESS;
        default:
            php_error_docref(NULL, E_WARNING, "needle is not a string or an integer");
            return FAILURE;
    }
}

PHP_FUNCTION(strpos)
{
    zval *needle;
    zend_string *haystack;
    const char *found = NULL;
    char  needle_char[2];
    zend_long  offset = 0;

    ZEND_PARSE_PARAMETERS_START(2, 3)
        Z_PARAM_STR(haystack)
        Z_PARAM_ZVAL(needle)
        Z_PARAM_OPTIONAL
        Z_PARAM_LONG(offset)
    ZEND_PARSE_PARAMETERS_END();

    if (offset < 0) {
        offset += (zend_long)ZSTR_LEN(haystack);
    }
    if (offset < 0 || (size_t)offset > ZSTR_LEN(haystack)) {
        php_error_docref(NULL, E_WARNING, "Offset not contained in string");
        RETURN_FALSE;
    }

    if (Z_TYPE_P(needle) == IS_STRING) {
        if (!Z_STRLEN_P(needle)) {
            php_error_docref(NULL, E_WARNING, "Empty needle");
            RETURN_FALSE;
        }

        found = (char*)php_memnstr(ZSTR_VAL(haystack) + offset,
                            Z_STRVAL_P(needle),
                            Z_STRLEN_P(needle),
                            ZSTR_VAL(haystack) + ZSTR_LEN(haystack));
    } else {
        if (php_needle_char(needle, needle_char) != SUCCESS) {
            RETURN_FALSE;
        }
        needle_char[1] = 0;

        php_error_docref(NULL, E_DEPRECATED,
            "Non-string needles will be interpreted as strings in the future. " \
            "Use an explicit chr() call to preserve the current behavior");

        found = (char*)php_memnstr(ZSTR_VAL(haystack) + offset,
                            needle_char,
                            1,
                            ZSTR_VAL(haystack) + ZSTR_LEN(haystack));
    }

    if (found) {
        RETURN_LONG(found - ZSTR_VAL(haystack));
    } else {
        RETURN_FALSE;
    }
}

Найдено здесь: https://github.com/php/php-src/blob/master/ext/standard/string.c

Это значит:

long: получить длинное значение и привести его к символу.

null or false: возвращает 0 (как символ)

true: возвращает 1 (как символ)

double: получить двойное значение, привести его к целому числу (что означает, что все части после того, как точка потеряна), а затем бросьте ее в символ.

object: получить длинное (? От объекта и привести его к персонажу.

Я не настолько глубоко знаком с C или Zend-Engine, и поэтому мог бы объяснить что-то не так. Но это должно быть на самом деле то, что вы искали.

...