|
Pers.narod.ru. PHP. Статьи. Используем статическую переменную класса и динамически формируем имя переменной класса |
С целью решения поставленных в заголовке задач напишем небольшой класс на PHP с именем democlass.
В этом классе опишем приватную переменную $var, а также статический (общий для всех экземпляров класса) элемент $count. С его помощью мы будем считать количество созданных экземпляров класса - значение $count будет увеличиваться на 1 в конструкторе __construct и уменьшается на 1 в деструкторе __destruct. Также конструктор может инициализировать переменную $var, если ему передан ненулевой аргумент. Листинг демо-класса:
<?php
class democlass {
private $var=0;
static public $count=0;
function __construct ($var=0) {
$this->var = $var;
democlass::$count++;
}
function __destruct() {
democlass::$count--;
}
function view () {
$numargs = func_num_args();
$arglist = func_get_args();
echo '<br>';
for ($i = 0; $i < $numargs; $i++) {
$var = $arglist[$i];
echo '$'.$var.'='.$this->var.' ';
}
}
}
?>
Про функцию view нужно сказать несколько слов отдельно - она умеет принимать переменное число аргументов, которые должны быть именами переменных класса без предшествующего "$" (у нас в классе всего одна нестатическая переменная, поэтому при тестовом вызове функции мы можем, например, напечатать значение $var дважды) и печатать с новой строки нужные переменные класса в виде имя=значение. Это может пригодиться при анализе и отладке классов на PHP.
Теперь напишем скрипт, использующий наш демо-класс и показывающий создание, удаление и просмотр объектов:
<?php
require_once 'democlass.php';
$c1 = new democlass();
$c2 = new democlass(1);
echo '2 objects created, $count='.democlass::$count;
$c2->__destruct();
echo '<br>1 object deleted, $count='.democlass::$count;
$c1->view ('var');
$c2->view ('var','var');
?>
Вообще-то PHP не нуждается в явных вызовах деструкторов, а объекты "живут" до конца выполнения скрипта, поэтому после явного вызова деструктора для объекта $c2
$c2->__destruct();
значение $count уменьшится, но объект прекрасно будет существовать, что видно из последующего вызова $c2->view.
Вот результаты выполнения скрипта:
2 objects created, $count=2 1 object deleted, $count=1 $var=0 $var=1 $var=1
|
|