#php #callback
Вопрос:
У меня есть функция обратного вызова для другой функции, которая просматривает комментарии к статье в моем блоге. Теперь я попытался переключиться на «многопоточные/вложенные» комментарии и, следовательно, расширил функцию обратного вызова. Пока все работает, но я не могу избавиться от ощущения, что я написал это не в соответствии с лучшей практикой php (и производительностью).
Я использую фреймворк css и должен выполнить некоторые математические вычисления для .span-xy
классов, которые я назначаю отдельным комментариям. Я начинаю с входного значения глобальной константы и вывода, например. span-12
для родительского комментария. Затем я должен уменьшить/увеличить значение на /- (int) 1
для каждого уровня вложенности. Поэтому я приступил к созданию массивов, их подсчету, повторению и созданию временных массивов для каждого комментария.
Вопрос: Есть ли более простой способ обойти это?
<!-- This is the final html mark-up output: List of comments (threaded/nested) -->
<ul>
<li id="1" class="push-<?php echo $push; ?> span-<?php echo $span; ?>">comment - parent</li>
<li id="2">comment - child of #1
<ul class="children">
<li id="3">comment - child of #2
<li id="4">comment - child of #2
<ul class="children">
<li id="5">comment - child of #4</li>
</ul>
<li id="6">comment - child of #2</li>
</ul>
<li id="7">comment - child of #2
<ul class="children">
<li id="8">comment - child of #7</li>
<li id="9">comment - child of #7</li>
</ul>
</li>
</li>
</ul>
<?php
// This is my callback function
function comment_list_cb( $comment, $args, $depth )
{
// retrieve the data from the globals or make them available
$GLOBALS['comment'] = $comment;
global $post;
static $width = MY_GLOBAL_WIDTH_CONSTANT;
static $ancestors = null;
// is Child/Parent comment
$parent = (int) $comment->comment_parent; // retrieve the ID of the parent
$is_child = false;
if ( $parent > (int) 0 ) // if we got a parent
{
$is_child = true;
if ( ! (array) $ancestors )
$ancestors = array();
if ( ! array_key_exists( $parent, $ancestors ) )
{
$ancestors[$parent] = get_comment_ID();
}
else
{
foreach ( $ancestors as $parent_id => $child_id )
{
if ( $parent_id == $parent )
{
$ancestors_temp[$parent_id] = $child_id;
break;
}
$ancestors_temp[$parent_id] = $child_id;
}
$ancestors = $ancestors_temp;
}
$parent_counter = count( $ancestors );
$span = $width - (int) $parent_counter;
}
else
{
$ancestors = $parent_counter = null;
$span = MY_GLOBAL_WIDTH_CONSTANT;
}
$span_txt = $span - (int) 2; // reduce per `2` because of the span-2 class at the avatar element
// now: build the classes
$push = $parent_counter != (int) 0 ? 'push-1' : '';
$child = $is_child === true ? ' child ' : '';
$list = comment_class( 'span-'.$span.' '.$push.' append-bottom last hreview comment-'.get_comment_ID().' '.$microid, get_comment_ID(), $post->ID, false );
?>
<!-- build the comment -->
<li <?php echo $list; ?>>
<div id="<?php get_comment_ID(); ?>">
<span class="comment-avatar span-2"><!-- display avatar img - width is span-2 --></span>
<span class="comment-meta span-<?php echo $span_txt; ?> last"><!-- display meta data like timestamp, etc. --></span>
<span class="comment-text span-<?php echo $span_txt; ?> last"><!-- display message --></span>
</div>
</li>
<?php
}
Ответ №1:
Просто несколько общих замечаний после быстрого сканирования. Он имеет дело с кодированием, независимо от функциональности.
$GLOBALS['comment'] = $comment;
Почему вы рассматриваете это в глобальном масштабе? Это может перезаписать существующую глобальную переменную. Передача по ссылке может быть более уместной здесь.
static $width = MY_GLOBAL_WIDTH_CONSTANT;
Почему это статично? Значение никогда не меняется, поэтому нет необходимости его сохранять.
if ( $parent > (int) 0 )
[...]
$span_txt = $span - (int) 2;
[...]
$push = $parent_counter != (int) 0 ? 'push-1' : '';
Нет необходимости приводить литерал int к int. Если вам нужно сравнение int, это переменная, которую вы должны использовать.
if ( ! (array) $ancestors )
$ancestors = array();
Если пустой массив, сделайте пустой массив? Просто сделай !isset($ancestors)
Комментарии:
1. Английский — не мой родной язык. Что означает «Нет необходимости приводить int-литерал к int. Если вам нужно сравнение int, это переменная, которую вы должны использовать». в смысле? Кстати: я исправил первые 2 вещи (оставшиеся от некоторых попыток/ошибок). Последний… Да, вы правы.
2. Вам это не нужно
(int)2
, так как 2 уже гарантированно будет int.