Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
19 / 18 / 5
Регистрация: 01.02.2013
Сообщений: 171

Статические свойства и методы

21.02.2016, 20:27. Показов 2134. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Перелопатил не один видеоурок, прочитал мануал изучил описание статических переменных и методов в интернете, но понял только:
- Статические переменные и методы принадлежат самому классу.
На этом мое понимание в этой области закончилось. А освоить эту тему очень хочется.

Возник ряд вопросов:

1. Для чего вообще нужны статические переменные и методы
2. Раскройте пожалуйста подробнее смысл "Статические переменные и методы принадлежат самому классу"
3. Приведите пожалуйста примеры, максимально простые, но так чтобы были понятны основные задачи статических переменных и(или) методов.

Спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.02.2016, 20:27
Ответы с готовыми решениями:

Статические свойства и методы
к статическим свойствам и методам можно обращаться через экземпляр объекта? Добавлено через 32 минуты все разобрался :D сначала...

Spl_autoload_register; статические методы
Доброго времени суток. Есть 2 не связанных между собой вопроса. 1) Никак не могу вникнуть в тему автозагрузки классов, а именно...

Наследование и статические методы классы
Уважаемые форумчане, у меня к вам небольшой вопрос! У меня есть два класса(Math, Mathi) причем Mathi наследован от Math. В них есть...

17
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
21.02.2016, 20:51
Цитата Сообщение от skolm Посмотреть сообщение
1. Для чего вообще нужны статические переменные и методы
как следует из определения:
Цитата Сообщение от skolm Посмотреть сообщение
Статические переменные и методы принадлежат самому классу.
они нужны для хранения каких-либо значений, общих для класса в целом
Цитата Сообщение от skolm Посмотреть сообщение
2. Раскройте пожалуйста подробнее смысл "Статические переменные и методы принадлежат самому классу"
Так ты же это понял
По сути это сильно улучшенная версия глобальных переменных.
Цитата Сообщение от skolm Посмотреть сообщение
3. Приведите пожалуйста примеры, максимально простые, но так чтобы были понятны основные задачи статических переменных и(или) методов.
Счетчик экземпляров класса
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class SelfCounter {
    private static $num = 0;
    public static function getNum() {
        return self::$num;
    }
    public function __construct() {
        ++self::$num;
    }
    public function __clone() {
        ++self::$num;
    }
    public function __destruct() {
        --self::$num;
    }
}
var_dump(SelfCounter::getNum());
$c1 = new SelfCounter();
var_dump(SelfCounter::getNum());
 
$c2 = new SelfCounter();
var_dump(SelfCounter::getNum());
 
$c3 = new SelfCounter();
var_dump(SelfCounter::getNum());
0
19 / 18 / 5
Регистрация: 01.02.2013
Сообщений: 171
21.02.2016, 20:57  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Так ты же это понял
Да понял только то что статические переменные принадлежат самому классу, всё на этом заканчивается понимание, потому что по сути, св-ва тоже принадлежат самому классу, например private $var, а в чем фокус статических переменных?

И в чем смысл статических методов?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
21.02.2016, 21:06
Цитата Сообщение от skolm Посмотреть сообщение
потому что по сути, св-ва тоже принадлежат самому классу
Нет, они принадлежат объекту
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Foo {
    public $var; // то принадлежит объекту
    public static $staticVar; // это классу
}
 
$foo1 = new Foo();
$foo1->var = 1;
$foo1::$staticVar = 1;
 
var_dump($foo1); // Выведет только $var, т.к. staticVar данному объекту не принадлежит
var_dump($foo1::$staticVar); // 1
 
$foo2 = new Foo();
$foo2->var = 2;
 
var_dump($foo2); // тут $var будет 2
var_dump($foo1); // а тут по прежнему 1
// т.е. изменение var в одном объекте не меняет $var в другом
 
var_dump($foo1::$staticVar); // по прежнему 1
var_dump($foo2::$staticVar); // выведет 1. По тому что $staticVar общее для всего класса
 
$foo2::$staticVar = 2;
var_dump($foo2::$staticVar); // теперь выводит 2
var_dump($foo1::$staticVar); // и тут тоже 2. т.к. $foo1::$staticVar и $foo2::$staticVar - одно и то же
0
19 / 18 / 5
Регистрация: 01.02.2013
Сообщений: 171
21.02.2016, 21:14  [ТС]
Ааааа, т.е., по сути, статические переменные это как ячейки в БД, хрянят записанные в них данные, до тех пор пока данные не будут уничтожены?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
21.02.2016, 21:16
Для обращения к статическим свойствам не нужен объект:
PHP
1
2
3
4
5
6
7
8
9
class Foo {
    public $var;
    public static $staticVar; 
}
 
// Foo->$var = 1; // так нельзя
Foo::$staticVar = 1; // можно
var_dump(
Foo::$staticVar);
Добавлено через 1 минуту
Цитата Сообщение от skolm Посмотреть сообщение
по сути, статические переменные это как ячейки в БД
Стоп. Мухи отдельно, котлеты отдельно. Бд и ООП друг с другом никак не связаны. Не надо смешивать эти понятия, это только запутает.
Цитата Сообщение от skolm Посмотреть сообщение
хрянят записанные в них данные, до тех пор пока данные не будут уничтожены?
Так про любую переменную сказать можно
0
19 / 18 / 5
Регистрация: 01.02.2013
Сообщений: 171
21.02.2016, 21:29  [ТС]
Я тогда ничего не понял. В чем смысл тогда? Зачем статические переменные и методы вообще нужны?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
21.02.2016, 21:36
Цитата Сообщение от skolm Посмотреть сообщение
В чем смысл тогда? Зачем статические переменные и методы вообще нужны?
Один пример выше я приводил. Счетчик существующих на данный момент экземпляров данного класса.
0
19 / 18 / 5
Регистрация: 01.02.2013
Сообщений: 171
21.02.2016, 21:47  [ТС]
Ну хорошо, а что мне мешает в конструкторе создать переменную, которая будет увеличиваться на 1, дальше в гет метод ее засунуть и возвращать. Тот же подсчет кол-ва создания классов, разве я не прав?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
21.02.2016, 21:50
Цитата Сообщение от skolm Посмотреть сообщение
разве я не прав?
Попробуй так сделать - не получится.
0
19 / 18 / 5
Регистрация: 01.02.2013
Сообщений: 171
21.02.2016, 22:22  [ТС]
Вот 2 строки, которые добавляются при создании класса и считают сколько раз класс был создан.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
    class Test
    {
        public $count = 0;
        
        public function __construct()
        {
            
        }
        public function getCount($counter)
        {
            $count = $counter;
            $count++;
            return $count;
        }
    }
    $counter = 0;
    
    $test = new Test;
    $counter = $test->getCount($counter);
    echo $counter;
    
    $test = new Test;
    $counter = $test->getCount($counter);
    echo $counter;
    
    $test = new Test;
    $counter = $test->getCount($counter);
    echo $counter;
    
    $test = new Test;
    $counter = $test->getCount($counter);
    echo $counter;
    
    $test = new Test;
    $counter = $test->getCount($counter);
    echo $counter;
    
    $test = new Test;
    $counter = $test->getCount($counter);
    echo $counter;
?>
Добавлено через 5 минут
Да по идее, даже одна строка, в принципе то вывод коунтера можно просто перед ?> прописать, в самом конце
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
21.02.2016, 22:32
Цитата Сообщение от skolm Посмотреть сообщение
Вот 2 строки, которые добавляются при создании класса и считают сколько раз класс был создан.
Это не решение. Достаточно внутри другой функции создать объект и все сломается.

Добавлено через 3 минуты
А если у меня нет в текущей области видимости объекта?
А зачем передавать текущее число объектов в метод?
А вдруг это число не доступно в текущей области видимости?
А как посчитать удаленные объекты?
А если кто-то перезапишет переменную counter?
0
19 / 18 / 5
Регистрация: 01.02.2013
Сообщений: 171
21.02.2016, 22:38  [ТС]
Но тем не менее, если если а а а а, всё прекрасно работает.

Цитата Сообщение от Jewbacabra Посмотреть сообщение
Достаточно внутри другой функции создать объект и все сломается.
В той же другой функции допишу
PHP
1
 $counter = $test->getCount($counter);
И ничего не сломается
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
21.02.2016, 22:41
Цитата Сообщение от skolm Посмотреть сообщение
Но тем не менее, если если а а а а, всё прекрасно работает.
Так все эти а а а - самое важное. Дьявол кроется в деталях.
Твой вариант работает в 1 ситуации, которую очень легко испортить. Мой в любых.
0
19 / 18 / 5
Регистрация: 01.02.2013
Сообщений: 171
21.02.2016, 22:43  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
А если у меня нет в текущей области видимости объекта?
А зачем передавать текущее число объектов в метод?
А вдруг это число не доступно в текущей области видимости?
А как посчитать удаленные объекты?
А если кто-то перезапишет переменную counter?
Это не относилось к решаемой задаче, но в любом случае можно будет построить доп функций которые будут решать все проблемы.

Вот почему выбор для подсчета создания экземпляров сразу у вас пал на статические переменные? Как определить что нужна статическая переменная или метод? Как это предугадать?

Вы же не просто из воздуха придумали такой подход и решили счетчик делать через статику, у вас наверняка появились причины, хотябы взять
Цитата Сообщение от Jewbacabra Посмотреть сообщение
А если у меня нет в текущей области видимости объекта?
А зачем передавать текущее число объектов в метод?
А вдруг это число не доступно в текущей области видимости?
А как посчитать удаленные объекты?
А если кто-то перезапишет переменную counter?

Вот я так же хочу разбираться, как и вы. А для этого пытаюсь исчерпывающе и по максимуму понять смысл всех элементов в ООП.
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
22.02.2016, 10:06
Цитата Сообщение от skolm Посмотреть сообщение
Вот почему выбор для подсчета создания экземпляров сразу у вас пал на статические переменные? Как определить что нужна статическая переменная или метод? Как это предугадать?
Да никак не предугадать. Просто программируйте и сами поймете.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
22.02.2016, 11:27
Лучший ответ Сообщение было отмечено skolm как решение

Решение

skolm
Статические переменные -- это один из способов создавать выражения со свободными переменными.
Рассмотрим функцию суммы:
PHP
1
2
3
function summ($x,$y) {
    return $x + $y;
}
Значения всех переменных здесь задано входящими данными. Результат работы такой функции зависит только от того, что в неё передано.

А теперь со свободной переменной:
PHP
1
2
3
function free_summ($x) {
    return $x + $y;
}
Теперь вычислить free_summ уже невозможно, опираясь только на входные данные. Необходимо "замкнуть" $y на конкретное значение. Это можно сделать используя "глобальное окружение", тогда $y будет называться "глобальной переменной".

PHP
1
2
3
4
function free_summ($x) {
    global $y;    
    return $x + $y;
}
Теперь результат работы функции зависит не только от того, что там в функции записано, но и от "окружения". Если измениться окружение, то и результат изменится, free_summ будет давать разный результат даже если вызвана с одним и тем же входным значением.
PHP
1
2
3
4
5
6
7
8
9
10
function free_summ($x) {
    global $y;    
    return $x + $y;
}
 
$y = 5;
echo free_summ(3); //8
 
$y = -2;
echo free_summ(3); //1
Кроме глобального окружения в PHP есть её несколько окружений, в которых тоже можно замкнуть свободные переменные значениями: окружение объекта и окружение класса.

Замкнём нашу переменную $y в окружении объекта
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Adder {
    public function summ($x)
    {
         return $x + $this->y;
    }
 
    public function __construct($y_)
    {
        $this->y = $y_;
    }
 
    private $y;
}
 
$adder3 = new Adder(3); //теперь $adder3->summ($x) будет прибавлять к $x три
$subtr2 = new Adder(-2); //теперь $subtr2->summ($x) будет вычитать из $x два
Таким образом, мы получаем возможность строить функции одной переменной, явно определяя одно из значений функции двух переменных в окружении объекта.

Теперь в нашем распоряжении три окружения: окружение функции/метода -- значение определяет в момент вызова, окружение объекта -- значение определяется состоянием объекта и разделяется всем методами объекта, глобальное окружение -- значение определяется на самом верхнем уровне и разделяется всеми методами всех объектов всех классов.
Для подавляющего большинства задач этих трёх окружений достаточно. Однако в некоторых случаях удобно иметь возможность создать такое окружение, которое определит значение некоторой свободной переменной для всех объектов конкретного класса. Такие переменные называют "статическими переменными класса" или "переменными уровня класса".

PHP
1
2
3
4
5
6
7
8
class ObscureAdder {
    private static $z = 1;
    
    public function summ($x)
    {
        return $x + $this->y + $z++;
    }
}
Теперь все объекты будут добавлять к ответу $z и увеличивать её на единичку. Но это отразится только на объектах класса ObscureAdder. Если мы создадим класс CorrectedAdder со своей статической переменной $z, то она никак не будет зависеть от значения $z в классе ObscureAdder, в отличие от глобальной переменной.
Вложения
Тип файла: pdf Environment.pdf (189.6 Кб, 6 просмотров)
1
Фрилансер
Эксперт PythonЭксперт JSЭксперт PHP
 Аватар для Azdeman
1871 / 1362 / 604
Регистрация: 12.01.2011
Сообщений: 5,470
22.02.2016, 13:21
Цитата Сообщение от mporro Посмотреть сообщение
return $x + $this->y + $z++;
тут у вас ошибка обращения к статическому свойству
PHP
1
self::$z++;
PHP
1
2
3
4
5
6
7
8
9
10
11
    class ObscureAdder {
    private static $z = 1;
    
    public function summ($x)
    {
        return $x + $this->y+self::$z++;
    }
}
$new = new ObscureAdder;
$new->y = 2;
echo $new ->summ(2);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2016, 13:21
Помогаю со студенческими работами здесь

статические методы и использование ими памяти
Имеются класс и 2 объекта abstract class A { public static function some(){ echo &quot;some&quot;; } public...

Используя статические объекты и статические методы, разработать программу движения по экрану прямой линии
Используя статические объекты и статические методы, разработать программу движения по экрану прямой линии и треугольника.

Используя статические объекты и статические методы, разработать программу движения по экрану прямой линии и квадрата.
Помогите, в решении задач, пожалуйста! 1. Используя статические объекты и статические методы, разработать программу движения по...

Статические свойства классов
Есть класс со статическим свойством class Data { protected: static char *str, *newStr; static unsigned long writedBytes,...

Статические методы
Доброго времени суток! Проблема такова: имеется класс, содержащий в себе статический компонент - список элементов класса. Имеется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru