Что означает сообщение, не является бинарным безопасным в php? [Дубликат]

Чтобы использовать методы и член объекта, вам сначала нужно создать этот объект. Если вы его не создали (переменная, которая должна содержать объект, не инициализируется), но вы пытаетесь использовать его методы или переменные, вы получите эту ошибку.

Иногда вы можете просто забыть инициализировать .

Отредактировано: new не может вернуть значение null, но исключение огня при ошибке. Давно это было на некоторых языках, но не больше. Спасибо @John Saunders за указание на это.

101
задан Zacky112 16 July 2010 в 12:52
поделиться

3 ответа

Это означает, что функция будет работать правильно, когда вы передадите произвольные двоичные данные (т.е. строки, содержащие байты без ASCII и / или нулевые байты).

Например, функция, не являющаяся двоичной, может основываться на функции C, которая ожидает строки с нулевым завершением, поэтому, если строка содержит нулевой символ, функция будет игнорировать что-либо после нее.

Это актуально, поскольку PHP не выполняет чисто разделение строковых и двоичных данных .

90
ответ дан Michael Borgwardt 27 August 2018 в 03:08
поделиться
  • 1
    Означает ли это, что бинарные безопасные строки содержат только «символы»? длины 1 байт? – Charlie Parker 9 July 2014 в 04:25
  • 2
    @CharlieParker: Нет, ты получил это назад. Двоичная безопасность является свойством functions , что означает, что они обрабатывают строку any правильно. Обратное будет строкой, которая содержит только символы ASCII и no null characters - такая строка должна обрабатываться корректно с помощью любой функции. – Michael Borgwardt 9 July 2014 в 07:36
  • 3
    – Charlie Parker 9 July 2014 в 17:05

Дополнительные примеры:

<?php

    $string1 = "Hello";
    $string2 = "Hello\x00World";

    // This function is NOT ! binary safe
    echo strcoll($string1, $string2); // gives 0, strings are equal.

    // This function is binary safe
    echo strcmp($string1, $string2); // gives <0, $string1 is less than $string2.

?>

\x указывает шестнадцатеричную нотацию. См. Строки PHP

0x00 = NULL
0x04 = EOT (End of transmission)

Таблица ASCII , чтобы увидеть список символов ASCII

52
ответ дан Anon30 27 August 2018 в 03:08
поделиться
  • 1
    Лучше всего объяснил. – Rajesh Paul 14 December 2013 в 12:23
  • 2
    Просто чтобы убедиться, что я понял, тогда Hello\r\nWORLD не должен быть таким же, как Hello, если функция двоично-безопасная, не так ли? – Charlie Parker 9 July 2014 в 03:28
  • 3
    Также как реализована такая функция? Есть ли регулярное выражение, которое проверяет его бинарный сейф или использует ли он другой метод? – Charlie Parker 9 July 2014 в 04:06

Другие пользователи уже упоминали, что означает binary safe вообще.

В PHP смысл более конкретный, ссылаясь только на то, что дает Майкл в качестве примера.

All строки в PHP имеют длину, связанную с числом байтов, которые ее составляют. Когда функция манипулирует строкой, она может либо:

  1. Полагаться на метаданные этой длины.
  2. Полагайтесь на строку с нулевым завершением, то есть после данные, которые на самом деле являются частью строки, появится байт со значением 0.

Также верно, что все строковые переменные PHP, управляемые движком, также завершают нуль. Проблема с функциями, которые полагаются на 2., состоит в том, что если сама строка содержит байт со значением 0, функция, которая манипулирует им, будет думать, что строка закончилась в этой точке и будет игнорировать все после этого.

Например, если функция PHP strlen работала как стандартная библиотека C strlen, результат здесь был бы неправильным:

$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
77
ответ дан Gerald 27 August 2018 в 03:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: