Нужно ли в дочерней теме WP окутывать функцию тегом ! function_exists ?

1 234
Gerga
На сайте с 02.08.2015
Offline
94
#21

SeVlad, где ты тут нашел убеждение? Без разницы, потому что у ТС нету этой политики на проект, т.е. он не понимает зачем ему нужен function_exists как обвертка функции.

Я дал возможность выбора для ТС.

Я не стал убеждать, что function_exists как обвертка функций - это хорошая практика программирования т.к. это не так. function_exists как обвертка функций это необходимость в некоторых случаях, а в некоторых это не нужно делать. Тут я хотел дать понять, что function_exists, в случае родительской темы, используется для реализации отношения "Родитель - Ребенок", а не ради хорошего тона или избежания ошибок. :(

SeVlad
На сайте с 03.11.2008
Offline
1609
#22
Gerga:
где ты тут нашел убеждение?

Если бы не убедил - он бы делал правильно. Правильно - это проверять существовании подобных функции.

И не "без разницы". Ибо разница всё таки есть. См. резюме.

Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
CK
На сайте с 26.02.2016
Offline
40
#23
SeVlad:
Если бы не убедил - он бы делал правильно. Правильно - это проверять существовании подобных функции.
И не "без разницы". Ибо разница всё таки есть. См. резюме.

Ребят, спасибо всем за такой спорный разговор между вами, я много чего понял. Единственное, что мне не очень понятно, почему это так называемое "правило хорошего тона" вы считаете обязательным. Я тут параллельно перелопатил целую кучу статей по этой теме и интересно, что мнения как и здесь разделилось 50/50. Интересное для себя утверждение нашел (по-моему в статье на wp-kama было), что обертывать этой функцией надо, если вы создаете свою тему (родительскую), особенно на продажу. А вот с дочерней можно не делать, если не планируете ее перепродавать, а будете использовать только в своих целях. Что думаете?

S
На сайте с 30.09.2016
Offline
469
#24
ChrisKorr:
мнения как и здесь разделилось 50/50

Естественно. Патамушта тут как раз дилемма.

1. Если обернуть определение функции в !function_exists, и кто-то определит функцию с таким же названием выше по коду до Вашего определения, то Ваше определение перестанет работать и Вы, как выше отметил Gerga, получите непредсказуемый результат.

2. Если не оборачивать определение функции в !function_exists, и кто-то определит функцию с таким же названием выше по коду до Вашего определения, то PHP выдаст фатальную ошибку и сайт перестанет работать.

Вот и выбирайте, 50/50. С учётом того, что пользовательских функций может быть и сто, и двести, и сколько угодно, и срабатывают они в самых разных ситуациях (например, не подключен какой-то файл - всё работает, подключился по запросу - перестало работать) - вообще развлечение не для ленивых получается. Поэтому Gerga и написал. что уж пусть лучше ошибку выдаст, чем криво работать будет. Если сайт упадёт - это сразу будет видно, а если кому-то цену на товар будет показывать 100 рублей вместо 150 - не сразу заметите.

Короче, идеального решения тут нет. Главное, чтобы Вы сами понимали риски каждого из вариантов. Исходя из того, что функции темы первичны, а прочие дополнения и расширения вторичны, правильнее не оборачивать функции темы в !function_exists - так Вы всегда будете уверены, что эта функция никогда не изменит своего поведения. При этом следует тщательно протестировать сайт перед выпуском на публику, а работу всяких расширений тестировать уже при их установке. И предпочтение следует отдавать плагинам, использующим ООП - они в этом смысле безопаснее.

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
Sly32
На сайте с 29.03.2012
Offline
302
#25

Господи - спасибо тебе что я могу забыть про эти ужасы пхп и вот такие вопросы, которые на 3 листа обсуждений! Смешали все в кучу...

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

Соответственно - если есть сомнения - обязательно нужна проверка

Даже если это вордпресс)))

S
На сайте с 30.09.2016
Offline
469
#26
Sly32:
если есть сомнения - обязательно нужна проверка

Я выше высказался именно в этом смысле

Sitealert:
По сути, феншуйно было бы делать проверку на существование функции, и в случае положительного ответа выводить окошко с надписью "Разберитесь с вашей долбаной функцией!".
CK
На сайте с 26.02.2016
Offline
40
#27
Sitealert:
Естественно. Патамушта тут как раз дилемма.
1. Если обернуть определение функции в !function_exists, и кто-то определит функцию с таким же названием выше по коду до Вашего определения, то Ваше определение перестанет работать и Вы, как выше отметил Gerga, получите непредсказуемый результат.
2. Если не оборачивать определение функции в !function_exists, и кто-то определит функцию с таким же названием выше по коду до Вашего определения, то PHP выдаст фатальную ошибку и сайт перестанет работать.

Вот и выбирайте, 50/50. С учётом того, что пользовательских функций может быть и сто, и двести, и сколько угодно, и срабатывают они в самых разных ситуациях (например, не подключен какой-то файл - всё работает, подключился по запросу - перестало работать) - вообще развлечение не для ленивых получается. Поэтому Gerga и написал. что уж пусть лучше ошибку выдаст, чем криво работать будет. Если сайт упадёт - это сразу будет видно, а если кому-то цену на товар будет показывать 100 рублей вместо 150 - не сразу заметите.

Короче, идеального решения тут нет. Главное, чтобы Вы сами понимали риски каждого из вариантов. Исходя из того, что функции темы первичны, а прочие дополнения и расширения вторичны, правильнее не оборачивать функции темы в !function_exists - так Вы всегда будете уверены, что эта функция никогда не изменит своего поведения. При этом следует тщательно протестировать сайт перед выпуском на публику, а работу всяких расширений тестировать уже при их установке. И предпочтение следует отдавать плагинам, использующим ООП - они в этом смысле безопаснее.

Да, это я понял. Но меня интересует еще вот такой момент...

Допустим я взял функцию с родительской без !function_exists, запихнул ее в к примеру в function.php своей дочерней темы и переделал ее под себя и т.д... Как мы выяснили здесь пофиг, сайт будет работать...

Но!

Что если через год автор родительской темы выпустит обновление этой темы, и что если обновлению будет подвержена эта функция, которую я изменил? Как в этом случае будет лучше, чтобы сохранить мою измененную работающую функцию при обновлении темы: 1) оставить ее без !function_exists или 2) все же обернуть в !function_exists заранее.

S
На сайте с 30.09.2016
Offline
469
#28
ChrisKorr:
Что если через год автор родительской темы выпустит обновление этой темы, и что если обновлению будет подвержена эта функция, которую я изменил?

Вы же её переписали под свои нужды - для того функции в родительской теме и оборачивают, чтобы Вы их переписывать могли. Сначала читается дочерняя тема. Авторы тем не идиоты, чтобы снимать обёртку.

Sly32
На сайте с 29.03.2012
Offline
302
#29
Sitealert:
Я выше высказался именно в этом смысле

Так я же с вами полностью согласен!

У нас в компании на сегодня в процессе разработки сейчас как минимум

- discover

- refactoring

- unit test

- review code

- QA test

- pull request

еще и ретроспективы встречаются. Понятно что это все для проектов, немного сложнее чем интернет-магазины, но все равно это очень дисциплинирует)))

Если я выдам код, не покрытый тестами и который от любого плагина упадет - меня прилюдно распнут)))

---------- Добавлено 15.02.2019 в 10:45 ----------

ChrisKorr:
Что если через год автор родительской темы выпустит обновление этой темы

У меня такое впечатление, что вы не понимаете зачем вообще эта проверка! Sitealert, вам же подробно разложил уже не раз!

Gerga
На сайте с 02.08.2015
Offline
94
#30
ChrisKorr:
Как мы выяснили здесь пофиг, сайт будет работать...

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

---------- Добавлено 15.02.2019 в 10:59 ----------

ChrisKorr:
Что если через год

Детский сад. А что если вы завтра не проснетесь?

---------- Добавлено 15.02.2019 в 11:30 ----------

Sly32:
Что касается стиля и хорошего тона - любая ошибка должна перехватываться, пользователь должен получать рабочий код а не падающий сайт. результат выполнения должен быть однозначным.

Конечно. Но ошибка

previously declared

может появиться при работе над сайтом, само по себе она не появится. Например если я добавил новую функцию и вижу ошибку previously declared, я просто переименую ее.

1 234

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий