Сохранить значение между вызовами функции, не использую глобалы или сесию

Кощей

if(!$needle) die("ooh");
Сохранить значение между вызовами функции, не использую глобалы или сесию

Очень интересует как такое в php можно реализовать.
К примеру чтобы функция каждый новый вызов возвращала число на 1 больше чем предыдущий раз
echo a(); //1
echo a(); //2
echo a(); //3
echo a(); //4
echo a(); //5
на перле я знаю один способ так сделать, а как в php кого не спрошу никто не знает
 

HraKK

Мудак
Команда форума
статическая переменная
==
Глобалы.

Автору надо - &
 

Кощей

if(!$needle) die("ooh");
Вид вызова вы видели, никаких переменных в функцию не передается
 

TutanXamoN

Новичок
PHP:
echo $i++;
И каждый раз число на 1 больше предыдущего :)

Если серьезно то кроме глобала(либо для числа, либо для кол-ва вызовов) вариантов не вижу. Хотя они должны бы быть.
Задачу необходимо решать именно в таком виде или есть более глобальная задача для решения которой необходим данный способ или другой?
 

Иван 76

Новичок
http://www.php.net/manual/ru/language.variables.scope.php
Использование статических переменных

Другой важной возможностью области видимости переменной является статическая переменная. Статическая переменная существует только в локальной области видимости функции, но не теряет своего значения, когда выполнение программы выходит из этой области видимости. Рассмотрим следующий пример:
<?php
function Test ()
{
$a = 0;
echo $a;
$a++;
}
?>
 

x-yuri

Новичок
статическая переменная
==
Глобалы
но статическая переменная !== Глобалы

статическая переменная отлично решает проблему, автор не говорил что ему нужно больше одного счетчика

если с помощью одной функции нужно создать много счетчиков, тогда можно передавать счетчик в качестве параметра по ссылке

еще, возможно, что на php задачу (для которой это надо) лучше решить другим образом
 

HraKK

Мудак
Команда форума
бредом тогда просто попахивает. Задачу в студию.
 

Кощей

if(!$needle) die("ooh");
Задача сделать функцию хелпер, на вход ей каждый раз дается масив и каждый запуск она возвращает следущее значение масива, а если следующего нет то берет первое и так далее.
С глобалами решается легко но не хочется иметь внешних переменных вне функции если это возможно.

-~{}~ 25.12.08 11:35:

Все я решил, статик переменная решает
Просто супер вышло, чистенько и красиво:
function a(){
static $a = 0;
$a++;
return $a;
}

print a();
print a();
print a();
print a();
print a();

выведет 01234
 

x-yuri

Новичок
а для чего тебе этот хелпер?

а хелпер можно сделать без дополнительных переменных: массив хранит позицию текущего элемента (его можно получить с помощью current). Только надо выяснить какие функции изменяют или сбрасывают текущую позицию в массиве

-~{}~ 25.12.08 11:37:

ты ж говорил, что у тебя массив на вход дается
 

Кощей

if(!$needle) die("ooh");
x-yuri
в данный момент чтобы рядки раскрашивать в таблице. По масиву я не хожу, я из него выбираю и даже не совсем из масива, а из списка аргументов функции

-~{}~ 25.12.08 11:41:

Автор оригинала: x-yuri
а для чего тебе этот хелпер?

а хелпер можно сделать без дополнительных переменных: массив хранит позицию текущего элемента (его можно получить с помощью current). Только надо выяснить какие функции изменяют или сбрасывают текущую позицию в массиве

-~{}~ 25.12.08 11:37:

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

-~{}~ 25.12.08 11:46:

Вот вообщем рабочий пример/результат

PHP:
function flip()
{
	static $flip_counter = 0;
	$num_args = func_num_args();
	if($flip_counter>=$num_args)
	{
		$flip_counter = 0;
	}
	$flip_counter++;
	return func_get_arg($flip_counter-1);
}
можете в цикле к примеру поставить
PHP:
foreach( 
...
<tr class="<?=flip('grey', 'blue', 'orange')?>"> ...
...
По моему вышло удобно и аккуратно.


Может у кого-то есть предложения по еще улучшению этой функции ?
 

x-yuri

Новичок
в данный момент чтобы рядки раскрашивать в таблице.
если я тебя правильно понял, то мне придумался такой вариант
PHP:
counter('clear');
foreach( $rows as $row ) {
    ...
    ?><tr class="<?php echo counter() % 2 == 0 ? 'even' : 'odd' ?>"><?php
    ...
}
а как тебе идея хранить счетчик прямо в массиве?

-~{}~ 25.12.08 11:50:

предыдущий пост не видел, когда отправлял
 

Кощей

if(!$needle) die("ooh");
x-yuri
у меня запись покороче и количество элементов не ограничено :)
 

x-yuri

Новичок
а ты проверял свой вариант? у тебя $flip_counter не инициализируется почти никогда, наверное имелось в виду $counter

-~{}~ 25.12.08 11:57:

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

-~{}~ 25.12.08 12:00:

а идея вообще интересная, но немного опасная))
 

Кощей

if(!$needle) die("ooh");
x-yuri
Опечатался в наборе, поправил
А чем опасная то ?

-~{}~ 25.12.08 12:07:

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

x-yuri

Новичок
мне по этому поводу вспоминается http://lurkmore.ru/++i_+_++i
мне сложно объяснить. Например, если ты используешь эту штуку в функции, а из нее вызываешь еще одну функцию, то работать будет некорректно - один счетчик на 2 функции

-~{}~ 25.12.08 12:09:

ну т.е. на данный момент все нормально, надо просто не провтыкать, когда тебе понадобится усложнить эту функции - вот этим, наверное, и опасна
 

HraKK

Мудак
Команда форума
ждый запуск она возвращает следущее значение масива, а если следующего нет то берет первое и так далее.
PHP:
<?php
class Cycle
{
private $array = array();
function __construct( $array )
{
$this->data = $array;
}
function __toString()
{
        return ( false ===( $result  = next($this->data ) ) ? current(reset($this->data)) : $result;
}
}
new Cycle( 'red','green','blue');
?>

<tr class="<?=$Cycle?>">
 
Сверху