Это хороший подход, чтобы использовать функции отладки для реализации функций?


Просто думаю, если использовать такой код

<?php

abstract class helper
{
    private static $_cycles = array();

    public static function isOdd($v)
    {
        return (0 == ($v % 2)) ? false: true;
    }

    public static function isEven($v)
    {
        return !self::isOdd($v);
    }

    public static function cycle($odd, $even)
    {
        $trace = debug_backtrace();
        $trace = $trace[0];
        $cycle = crc32(serialize($trace));

        if (!isset(self::$_cycles[$cycle]))
        {
            self::$_cycles[$cycle] = 1;
        }

        return (self::isOdd(self::$_cycles[$cycle]++)) ? $odd : $even;
    }
}

в особенности такой

<?php foreach ($data as $record): ?>
    <p class="<?php echo helper::cycle('oddCss', 'evenCss'); ?>"><?php echo $record; ?></p>
<?php endforeach; ?>

не overcoded

ПС
Простота использования (для верстальщиков) более важны, чем производительность в данном конкретном случае

Обновление:
Как @Джеффри упомянул, что я не сказала раньше, что же oddCss', 'evenCss' пара может использоваться несколько раз на одной странице (поэтому в основном в один запрос)



513
6
задан 25 марта 2011 в 03:03 Источник Поделиться
Комментарии
5 ответов

Ну, через debug_backtrace за это (явно не самая быстрая функция в городе) - это огромный перебор. Насчет прохождения ИД? Преимущество, помимо производительности, является то, что вы можете использовать один и тот же счетчик в разных местах.

Код:

<?php

abstract class helper
{

protected static $_cycles = array();

public static function cycle($cycle_id, $odd, $even)
{

self::$_cycles[$cycle_id] = isset(self::$_cycles[$cycle_id]) ? !self::$_cycles[$cycle_id] : true;

return self::$_cycles[$cycle_id] ? $odd : $even;
}

}

Использование:

<?php foreach ($data as $record): ?>
<p class="<?php echo helper::cycle('mycycle', 'oddCss', 'evenCss'); ?>"><?php echo $record; ?></p>
<?php endforeach; ?>
// Data from another source, but continuous display
<?php foreach ($data2 as $record): ?>
<p class="<?php echo helper::cycle('mycycle', 'oddCss', 'evenCss'); ?>"><?php echo $record; ?></p>
<?php endforeach; ?>

3
ответ дан 25 марта 2011 в 08:03 Источник Поделиться

Поскольку это сайт проверка кода, позвольте мне отметить, что следующую мерзость:

return (0 == ($v % 2)) ? false: true;

Константы являются избыточными. Гораздо проще:

return (0 != ($v % 2));

(В скобках также излишним, но это никак не связано.)

5
ответ дан 25 марта 2011 в 04:03 Источник Поделиться

Что-то немного проще (без регистрации):

class Cycler {
$evenFlag = true;

/* Returns the next value in an even/odd series */
function next($odd, $even) {
$evenFlag = !evenFlag;

return $evenFlag? $even: $odd;
}
}

Использование:

<?php Cycler cycler = new Cycler(); ?>
<?php foreach ($data as $record): ?>
<p class="<?php echo cycler.next('oddCss', 'evenCss'); ?>"><?php echo $record; ?></p>
<?php endforeach; ?>

Вы также можете добавить сброс() Если вы хотите использовать велосипедист несколько раз.

3
ответ дан 25 марта 2011 в 06:03 Источник Поделиться

Это явно переусложненный. В isOdd и isEven способ бесполезны, так как они всего лишь результат библиотеки FMOD($я, 2)

Я предполагаю, что вы используете КПР часть для отслеживания циклов за $чет/$даже пары, но это не требуется. Вместо этого вы можете просто хэш-Аргументы и сохранить счетчик на хэш.

Последнее, я думаю, что статический-это ересь, и я бы очень хотел, чтобы помощник instanciated.

Я бы написал что-то вроде этого, предполагая, $лишком и даже всегда строки (не проверял):

<?php

class helper
{
private $cycles = array();

function cycle($odd, $even)
{
$hash = md5($odd.$even);

if (!isset($this->cycles[$hash]))
{
$this->cycles[$hash] = 0;
}

return fmod($this->cycles[$hash]++, 2) ? $odd : $even;
}
}

$helper = new helper();

$helper->cycle('foo', 'bar');

1
ответ дан 25 марта 2011 в 06:03 Источник Поделиться

Я думаю, что Codeigniter имеет что-то вроде этого (да, генератор() помощник):

function Cycle()
{
static $i = 0;

if (func_num_args() > 0)
{
return func_get_arg($i++ % func_num_args());
}

return $i = 0;
}

Работает на переменное число аргументов, которые могут быть полезны в определенных ситуациях.

0
ответ дан 26 марта 2011 в 05:03 Источник Поделиться