Как вывести static переменную из функции?

294
20 мая 2017, 20:27
<?php
function sta() {
  static $i = 0;
  $i++;
  return $i;
}
sta();
sta();
sta();
sta();
echo $i;
?>

Хочу чтобы переменная возвращала количество вызовов функции

Answer 1

Мне кажется вы пытаетесь использовать инструмент не по назначению. Хотите иметь возможность получать доступ к подобному счетчику извне - используйте глобальную переменную или объекты

Например такой костыль с глобальной переменной:

function sta() {
    static $i = 0;
    if ($i == 0) {
        $GLOBALS['sta_i'] = &$i;
    }
    $i++;
    return $i;
}
sta();
sta();
sta();
sta();
echo $sta_i;

...или объектом:

class StaClass {
    private $i = 0;
    public function sta() {
        $this->i++;
        return $this->i;
    }
    public function getCount() {
        return $this->i;
    }
}
$o = new StaClass();
$o->sta();
$o->sta();
$o->sta();
$o->sta();
echo $o->getCount();

...еще вариант со ссылками, но без засорения глобальной области

function &sta() {
    static $i = 0;
    $i++;
    return $i;
}
$sta_i = &sta();
sta();
sta();
sta();
echo $sta_i;
Answer 2

Вы возвращаете переменную $i в конце функции, достаточно просто ответ функции в переменную загонять и посмотреть, а так вы к ней не обратитесь напрямую.

<?php
function sta() {
  static $i = 0;
  $i++;
  return $i;
}
sta();
sta();
sta();
$count = sta();
echo $count; // Выведет 4

Но это тоже такой себе вариант.

READ ALSO
Генератор уникальных ID

Генератор уникальных ID

Нужен код генератора уникальных IDПоискал в интернете

243
&#39;-&#39; в названии папок и namespace

'-' в названии папок и namespace

В моем проекте между словами в названиях папок есть '-'Т

196
Изменить параметры в UDP socket PHP

Изменить параметры в UDP socket PHP

При посылке UDP пакета через socket требуется изменить внутренние параметры Version Type Pap/Chap Rsv UserIp AttrNum

224
Отслеживание изменения элементов

Отслеживание изменения элементов

Здравствуйте, как правильно отследить изменение статуса checked input:radio и если отмечен, то брать значение соответствующего ему select (платежный...

259