Определяемые пользователем магические методы: что такое задокументированная магическая функциональность?

Мой вопрос довольно прост, вот контекст:

http://php.net/manual/en/language.oop5.magic.php

Магические методы

Имена функций __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state() и __clone() являются волшебными в классах PHP. У вас не может быть функций с такими именами ни в одном из ваших классов, если вы не хотите, чтобы с ними была связана магическая функциональность.

PHP резервирует все имена функций, начинающиеся с __, как магические. Не рекомендуется использовать имена функций с __ в PHP, если только вы не хотите задокументировать магическую функциональность.

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

... если вам не нужна документированная магическая функциональность.

Что это хотя бы значит? Существуют ли фактические причины для создания определяемого пользователем __magicMethods()?


person Wesley Murch    schedule 14.03.2012    source источник
comment
Это означает, что если вы не хотите использовать некоторые магические функции, предоставляемые именами функций выше. Это предложение можно было бы написать более лаконично: Не рекомендуется создавать имена новых функций с помощью __.   -  person salathe    schedule 14.03.2012
comment
Это сбивает с толку, потому что (для меня) это предполагает, что вы можете создать свой собственный магический метод с помощью __namingConvention и каким-то образом он унаследует или иным образом задокументирует некоторые магические функции. Это действительно может быть катастрофой, я удивлен, что они прямо не запрещают это или, по крайней мере, явно не поощряют это. Скорее, это просто рекомендация не использовать его.   -  person Wesley Murch    schedule 14.03.2012
comment
Я предлагаю вам (или всем, кто это читает) подать отчет об ошибке с, в идеале, предлагаемой альтернативной формулировкой. Было бы неплохо услышать ваше мнение об этом, как человека, у которого были проблемы с оригинальной формулировкой.   -  person salathe    schedule 15.03.2012


Ответы (2)


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

РЕДАКТИРОВАТЬ - чтобы быть еще яснее: допустим, что вы реализуете для своей бизнес-логики метод с именем __toNumber(). В будущей версии PHP они решают, что всякий раз, когда объект используется в качестве числа (возможно, когда вы делаете $result = 3 * $yourObject), будет вызываться магический метод __toNumber()... ваш объект будет иметь некоторую документированную "волшебную" функциональность, даже если вы этого не сделали. специально добавить это

person Nicola Peluchetti    schedule 14.03.2012
comment
Да, это немного сбивает с толку. Они должны просто сказать Никогда не делайте этого, иначе вы можете столкнуться с катастрофическими последствиями, если это так. - person Wesley Murch; 14.03.2012
comment
@Madmartigan, ну, я думаю, они просто имеют в виду «Делай это на свой страх и риск», но лучше, если ты этого избежишь :) - person Nicola Peluchetti; 14.03.2012
comment
Я полагаю, что тогда это было просто неверное истолкование с моей стороны. То, как это сформулировано, довольно запутанно, как будто они предлагают вам воспользоваться какой-то функцией, написав свои собственные магические методы. Эту часть нужно просто удалить. - person Wesley Murch; 14.03.2012
comment
@Madmartigan да, их формулировка сбивает с толку, я думаю, они хотели быть ироничными! :) - person Nicola Peluchetti; 14.03.2012
comment
@Madmartigan Я думаю, они на самом деле говорят, что вы никогда не должны этого делать: ... __ в PHP, если только вам не нужна какая-то документированная магическая функциональность. где «документированная» относится к магии реально реализованные методы. Что по сути означает: не используйте имена методов, которые выглядят как магические методы, но таковыми не являются. - person Yoshi; 14.03.2012

Это означает, что никогда не используйте имена, начинающиеся с __, для функций, если вы не хотите, чтобы магическая функциональность была задокументирована в руководстве по PHP.

person meze    schedule 14.03.2012
comment
Итак, что произойдет, если я создам метод с именем __myMagic()? Это просто результат моего неправильного толкования формулировки руководства? - person Wesley Murch; 14.03.2012
comment
Ничего. Пока некоторые разработчики ядра php не решат, что было бы неплохо добавить немного магии для __myMagic. - person meze; 14.03.2012
comment
Как вы думаете, почему эта строка вообще присутствует в руководстве? Следует сказать если это не один из предопределенных методов выше, верно? - person Wesley Murch; 14.03.2012
comment
predefined methods означает что-то еще (например, предопределенная переменная $_GET). Документировано - лучшее слово. - person meze; 14.03.2012
comment
Кстати, Doctrine2, одна из популярных ORM, использует __load для своих нужд. - person meze; 14.03.2012