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

123 4
Gerga
На сайте с 02.08.2015
Offline
94
#11

Sitealert, как это ТС сделал? :)

Смотрите, например я рассчитываю, что моя функция


function hello() {
return print 'Hello, World';
}

может быть переопределена. Ну например вдруг пользователь захочет ее модернизировать, если он полезет в код плагина и там отредактирует, то после моего очередного коммита и обновления он просто потеряет свой код (читай работу). Как быть? Вот тут и может быть полезен function_exists. Пример:


if (!function_exists('hello')) {
function hello() {
return print 'Hello, World';
}
}

function hello() {
return print 'Hello, City';
}

hello();

Но я это сделал. потому что предпологал возможность переопределения.

S
На сайте с 30.09.2016
Offline
469
#12

Gerga, функцию в глобальном пространстве невозможно переопределить. Вернее можно, но с помощью специальной функции, а не просто так - написал и готово.

PS. Вот она (но как-то не очень её рекомендуют использовать)

http://php.net/manual/ru/function.runkit-function-redefine.php

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
Gerga
На сайте с 02.08.2015
Offline
94
#13

Sitealert, вы не улавливаете суть или улавливаете, но не принимаете почему-то.

S
На сайте с 30.09.2016
Offline
469
#14
Gerga:
Sitealert, вы не улавливаете суть или улавливаете, но не принимаете почему-то.

По сути, феншуйно было бы делать проверку на существование функции, и в случае положительного ответа выводить окошко с надписью "Разберитесь с вашей долбаной функцией!".

S
На сайте с 13.10.2014
Offline
171
#15

Отсюда мораль, переходите на объектное программирование )))

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

Fatal error cannot redeclare function ..., previously declared in ...

(а в ЦМС, вроде вордпресса иногда бывает так что дергается этот самый файл раз по 10)

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

И это не только вордпресса касается

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

SeVlad
На сайте с 03.11.2008
Offline
1609
#16
Gerga:
безсмысленно делать вещи, которые не пригодятся.

Что бессмысленно, а точнее даже вредно - так это нести такую чушь, что ты тут нагородил.

Мало того, что такие обёртки - правила хорошего тона, так именно в дочерних темах это нужно делать. Т.к. переопределяются функции родителей.

Можно (!=нужно) не делать только в том случае, если сам именуешь функцию, со 100% уверенностью, что такое имя больше нигде не встретиться и никем больше функция не будет использоваться (переопределяться). Это явно не о именах типа "theme_social_links".

Gerga:
где не нужно повторное определение функции - это приведет к непонятному поведении,

1. Люди, для решения "непонятностей" ставят контрольные метки.

2. Это в ваших сапописьках может привести к чему угодно. Тут же речь не просто о ВП, а о функциях родительской темы.

3. Лучше пусть будут "непонятости", чем после таких советов завалится сайт на продакшене (а именно так поступают множество хомячков - правят файлы на продакшене. Причем зачастую без доступа к ФТП, а через редактор в ВП, при этом возмущаются когда им говоришь, что это риски).

Резюме: почти гарантированно ничего не случится, если не обернуть. Но а) всё же есть "почти" и б) нужно с самого начала формировать в себе привычки делать правильно.

Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
Gerga
На сайте с 02.08.2015
Offline
94
#17

silicoid, вы правы, function_exists отвечает на вопрос "Существует ли такая функция?", как пользоваться этой информарцией - проектное решение. Но я более чем уверен, что в коде ядра что фреймворков, что CMSок function_exists/class_exists не оборачивает каждую функцию/классс ради хорошего тона программирования или избежания повторного определения - это было бы глупо. Вы только представьте что было был, если бы это делалось. function_exists/class_exists должны оборачивать только те функции и классы для которых это нужно и точка. Если готоворит о WP, в файле wp-includes/pluggable.php можно увидитеь какие функции доступны для переопределения.

Как я использую function_exists в контексте WP:

1. Cвязка плагин - плагин. Отношение композиция. Плагин B вызывает функцию плагина A, тут нужна проверка на наличие вызываемой функции;

2. Связка тема - плагин. Отношение композиция. Тема вызывает функцию плагина, тут нужна проверка на наличие;

3. Связка родительская тема - дочерняя тема. Отношение наследование. Определенные функции родителя должны быть обвернуты function_exists , чтобы ребенок мог их переопределять.

SeVlad:
так именно в дочерних темах это нужно делать.

Это делается в родительских темах.

---------- Добавлено 14.02.2019 в 09:43 ----------

SeVlad:
3. Лучше пусть будут "непонятости",

корпоративное решение, где-то это уместимо, а где-то нет.

SeVlad
На сайте с 03.11.2008
Offline
1609
#18
Gerga:
Это делается в родительских темах.

Это делается. Делается нормальными разработчиками. В темах в тч.

А "родительской" она становится только если у неё образуется дочка. Никто не отменял правило проверять существование функций хоть в дочках, хоть в плагинах, хоть где. Это есть такие правила качественного кодинга, как напр. писать <?php а не фигню "сокращённо" <?

---------- Добавлено 14.02.2019 в 10:48 ----------

Gerga:
Но я более чем уверен, что в коде ядра что фреймворков, что CMSок function_exists/class_exists не оборачивает каждыю функцию/классс ради хорошего тона программирования

Каждую - нет. (Хотя это есть нередкая причина, что гордятся костыли и правится ядро). Но те, которые допускается/возможно поменять - обязательно. Грубо говоря - те, что могут быть кастомизированы юзером для его задач.

Но это никак не относится к вопросу ТСа.

Gerga
На сайте с 02.08.2015
Offline
94
#19
SeVlad:
Но те, которые допускается/возможно поменять - обязательно. Грубо говоря - те, что могут быть кастомизированы юзером для его задач.

Конечно. Я с самого начала с этого и начал.

SeVlad
На сайте с 03.11.2008
Offline
1609
#20
Gerga:
Я с самого начала с этого и начал.

Ты с самого начала убедил ТСа делать неправильно.

123 4

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