Дефинирани от потребителя магически методи: Какво е документирана магическа функционалност?

Въпросът ми е доста прост, ето контекста:

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 core решат, че би било готино да добавят малко магия за __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