Почему php добавляет нулевые байты к именам частных и защищенных свойств?

Я новичок в мире PHP и изучаю его на php.net. Я знаю, что при преобразовании объекта в массив нулевой байт добавляется к именам закрытого и защищенного свойств, когда ClassName или ключ звездочки (*) добавляется к частному и имена защищенных свойств в ключах массива.

Но мой вопрос в том, что ПОЧЕМУ php добавляет нулевые байты, ЧТО является причиной?

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

Примеры очень помогут.

Спасибо


person Community    schedule 18.08.2017    source источник


Ответы (1)


Суть свойств private/protected в том, что вы не должны получать к ним доступ извне самого класса. Это не мера безопасности или что-то в этом роде, это обеспечение соблюдения контрактов между различными частями вашего кода. Когда вы помечаете что-то как private/protected, вы явно заявляете, что эта вещь не предназначена для общего пользования и что с ней не должен быть связан внешний код.

В основном это напоминание для вас и других разработчиков, и в худшем случае вы получите легкий шлепок по запястью, если вы не подчинитесь этому маркеру; это ни в коем случае не железная защита. Есть множество способов обойти это, например. используя Отражение. Но, если сделать доступ к этим закрытым частям слишком простым, разработчики, вероятно, будут делать это направо и налево и сведут на нет весь смысл.

Поскольку эти свойства включаются в массив при приведении объекта к массиву, по крайней мере, не сразу становится очевидным, как получить к ним прямой доступ из-за добавленных NUL байтов. Если вы потратите время, чтобы выяснить, как получить к ним доступ, вы, надеюсь, действительно знаете, что делаете.

TL;DR: (я полагаю) это минимальная попытка попытаться обеспечить соблюдение некоторых минимальных стандартов кодирования и не позволить новичкам нарушать все принципы ООП, когда они выяснят, что такое приведение массива.

person deceze♦    schedule 18.08.2017
comment
Фактическая причина заключается в устранении неоднозначности свойств с одинаковыми именами, объявленных в разных классах. Если задействованы частные свойства, вы можете иметь несколько свойств с одним и тем же именем для одного объекта. - person NikiC; 18.08.2017
comment
@NikiC Почему тогда именно NUL байт, разве это уже не адресовано добавленными звездочками? - person deceze♦; 18.08.2017
comment
Ведущие нулевые байты — это простой способ различить общедоступные и частные свойства. Нулевой байт после имени класса гарантирует, что имя класса можно использовать как строку с завершающим нулем, не требуя явного копирования. По соглашению PHP обычно использует нулевые байты для обозначения различных специальных и зарезервированных имен, включая имена анонимных классов, функции create_function и т. д. - person NikiC; 18.08.2017
comment
То, как генерируются эти имена, на самом деле является деталью реализации, которая просачивается в случае приведения объектов к массивам и теперь сохраняется по соображениям обратной совместимости. Я только объясняю, почему это искажение имени необходимо внутри. - person NikiC; 18.08.2017
comment
@NikiC Отличное понимание; отдельный ответ от вас может быть здесь. - person deceze♦; 18.08.2017