Intereting Posts
Шаблон DataMapper PHP: моему классу нужен экземпляр PDO, я хочу обернуть его внутри класса Db Как мы можем назвать функции Php на основе сценария Java-кода If-else? Как изменить цвет надписи, нарисованной с помощью функции newPseudoImage PHP Imagick? регулярное выражение для десятичных знаков Объединить массивы для формирования многомерного массива в php php-apcu (CGI / FastCGI) apc_fetch всегда возвращает false если подтверждение успешно скрыть кнопку отправки и показать загружаемое изображение Не удается получить доступ к вспомогательной директории на сервере Как я могу подсчитать общее количество встроенных функций в PHP? передача данных в angular.js из PHP Формат времени Php Сделать таблицу с несколькими столбцами из файла CSV с помощью PHP обновить переменную сеанса сеанса без обновления страницы как защитить паролем загружаемые pdf-файлы на веб-сайте Удалить последний символ из строки

Что такое целочисленное свойство и что значит «\ 0A \ 0A»?

Я прочитал это из руководства по PHP :

Если объект преобразуется в массив, результатом является массив, элементами которого являются свойства объекта. Ключи – это имена переменных-членов, с несколькими заметными исключениями: целочисленные свойства недоступны ; частные переменные имеют имя класса, добавленное к имени переменной; защищенные переменные имеют «*», добавленные к имени переменной. Эти предварительные значения имеют нулевые байты с обеих сторон. Это может привести к неожиданному поведению:

class A { private $A; // This will become '\0A\0A' } class B extends A { private $A; // This will become '\0B\0A' public $AA; // This will become 'AA' } var_dump((array) new B()); 

Вышеуказанное будет иметь два ключа с именем «AA», хотя один из них на самом деле называется «\ 0A \ 0A».

Я не совсем понимаю смысл этих частей с этим шрифтом.

Что такое целочисленное свойство?

В чем смысл «Эти предварительные значения имеют нулевые байты с обеих сторон. Это может привести к неожиданному поведению»?

и что это значит? »Вышеуказанное будет иметь два ключа с именем« AA », хотя один из них на самом деле называется« \ 0A \ 0A »

Вы можете получить представление о новых ключах массива, используя этот код.

 $x = (array)new B(); foreach ($x as $key => $value) { echo bin2hex($key), ' = ', $value, PHP_EOL; } 

Он показывает шестнадцатеричное представление значений ключа, из которых вы можете более четко видеть, что происходит:

 00420041 = 4141 = 00410041 = 

Ключ массива для первого свойства ( B::A ) кодируется как "\x00B\x00A" , то есть chr(0) . 'B' . chr(0) . 'A' chr(0) . 'B' . chr(0) . 'A' chr(0) . 'B' . chr(0) . 'A' , потому что его видимость является частной для B

Второе свойство ( B::AA ) кодируется как просто 'AA' , потому что его видимость является общедоступной.

Третье свойство ( A::A ), похожее на первое, кодируется как "\x00A\x00A" , потому что его видимость является частной для A

Я не совсем уверен, что такое целочисленные свойства. Я бы не стал беспокоиться о числовых свойствах, так как их использование незначительно и обескуражено (вероятно, поэтому не упоминается об этой «функции».

Целочисленные свойства

Это относится к свойствам, имена которых представляют собой строковые представления десятичных целых чисел. Например:

 $o = new stdClass; $o->{"123"} = 'foo'; // create a new integer property echo $o->{"123"}, PHP_EOL; // verify it's there $a = (array)$o; // convert to array echo $a['123']; // OOPS! E_NOTICE: Undefined offset! var_dump(array_keys($a)); // even though the key appears to be there! print_r($a); // the value appears to be there too! 

В общем, целочисленные свойства PHP не являются чем-то, что вы должны приблизить, если вы цените свое здравомыслие .

Предполагаемые значения, окруженные null

Для private и protected свойств сгенерированные ключи массива будут содержать непечатаемый символ "\0" . Это может быть полезно (так как этот символ не является законным для имени свойства, вы можете использовать эту информацию для определения видимости свойств), но это также может быть неприятностью, если вы не ожидаете, что он будет там. Пример:

 class A { private $A; // This will become '\0A\0A' } class B extends A { private $A; // This will become '\0B\0A' public $AA; // This will become 'AA' } $a = (array) new B(); // The array appears to have the keys "BA", "AA" and "AA" (twice!) print_r(array_keys($a)); // But in reality, the 1st and 3rd keys contain NULL bytes: print_r(array_map('bin2hex', array_keys($a))); 

Вы можете извлечь информацию о видимости из ключей массива следующим образом:

 $a = (array) new B(); foreach ($a as $k => $v) { $parts = explode(chr(0), $k); if (count($parts) == 1) { echo 'public $'.$parts[0].PHP_EOL; } else if ($parts[1] == "*") { echo 'protected $'.$parts[2].PHP_EOL; } else { echo 'private '.$parts[1].'::$'.$parts[2].PHP_EOL; } }