Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
-13 / 2 / 0
Регистрация: 14.08.2014
Сообщений: 240

Непонятное обращение к классам

22.02.2016, 01:12. Показов 1313. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Видел конструкции вида $nabor_bukv->chto_to_eshe()->kakaya_to_shtuka
Например в ООП стиле общения с БД.
Приведите простейший пример того класса.

Не могу более понятно объяснить.
Ну смотрите, я могу например запилить класс
PHP
1
2
3
4
5
6
7
8
class lololo
{
   public sex;
   my_sex(my_sex)
   {
     $this->sex = my_sex;
   }
}
И могу взаимодействовать так:
PHP
1
2
3
$temp = new lololo;
$temp->sex;//Мой пол
$temp->my_sex('male');//Устанавливаю пол
Но что мне нужно такого сделать, что бы была такая адская конструкция с 2мя и более "->"?

Ну вы должны меня понять, я имею ввиду что-то вроде
PHP
1
$temp->sex_arr('select_m')->kakaya_to_shtuka->eshe_odna->i_tak_dalee;
И как это называется?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.02.2016, 01:12
Ответы с готовыми решениями:

Обращение к разным классам из класса
Есть класс: <?php namespace app\controllers; class MainController{ public function index() { ...

обращение к классам css
Есть css класс: <style type="text/css"> .some { display: none; } </style> И в теле документа: <div...

Обращение к классам-наследникам в списке list
Приветствую. Имеется базовый класс(назовём его 1 уровнем) с двумя наследниками(2 уровнем) и у каждого из двух наследников имеется ещё по...

9
Hello Kitty
 Аватар для WhiteMind
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
22.02.2016, 01:25
Лучший ответ Сообщение было отмечено AlexBitard как решение

Решение

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
 
class Shtuki {
    public $sex;
    public function __get($k) {
        return $this;
    }
    public function __set($k , $v) {
        $this->sex = $v;
    }
    public function __call($fname , $arg) {
        return $this;
    }
}
 
$temp = new Shtuki();
$temp->sex_arr('select_m')->kakaya_to_shtuka->eshe_odna->i_tak_dalee;
Добавлено через 1 минуту


Добавлено через 43 секунды
но если серьезно то надо возвращать объект класса . этот же либо другой ранее созданный

Добавлено через 6 минут
Вот я сделал пример:
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
<?php
 
class lololo {
    public $sex;
    public function my_sex($my_sex) {
        $this->sex = $my_sex;
    }
    public function __construct( $cl ) {
        $this->info = $cl;
    }
    public $info;
}
class Info {
    public $name;
    public $surname;
    public $age;
    public function __construct( $name , $surname , $age ) {
        $this->name = $name;
        $this->surname = $surname;
        $this->age = $age;      
    }
}
 
$lol = new lololo( new Info( 'White' , 'Mind' , 20 ) );
$lol->my_sex( 'man' );
echo $lol->info->name;
1
-13 / 2 / 0
Регистрация: 14.08.2014
Сообщений: 240
22.02.2016, 02:00  [ТС]
WhiteMind, Большое спасибо за такой быстрый ответ, скажите, как это вообще использовать?
Простейший пример для чего это применяют?

И вот ещё. Например мне зачем-то нужно функцией создать массив из 3х элементов, array(1,2,3);
А потом, следующей штукой посчитать элементы массива (count())
Как мне это реализовать в виде
PHP
1
$temp->funciya_kotoraya_sozdayot_massiv_iz_3h_elementov()->num_element
? Я понимаю что это до безумия глупый пример какой-то, но я просто попытался скорчить из этого "$db->query()->num_rows"

Я просто не совсем понял как это использовать и для чего, но думаю что мне это нужно, лол

Добавлено через 13 минут
WhiteMind, Почитал про конструкты, прикольно, я и забыл о том, что можно устанавливать по дефолту значения переменных в классе.

Я это делаю функцией(методом?) set() где ввожу нужные значения инициализируя их таким вот образом.

Но как работают штуки, для чего они и как называются я всё ещё не понимаю.
Очень даже интересно
0
Hello Kitty
 Аватар для WhiteMind
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
22.02.2016, 02:02
Цитата Сообщение от AlexBitard Посмотреть сообщение
Я просто не совсем понял как это использовать и для чего, но думаю что мне это нужно
интересный подход. сам так делаю
с массивом просто не выйдет.но можно попробовать
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
<?php
 
class Class_Array implements ArrayAccess {
    private $array = [];
    public function __construct() {
        $this->array = func_get_args();
    }
    public function offsetSet( $key , $value ) { if ( $key === null ) { $this->array[] = $value; } else { $this->array[ $key ] = $value; } }
    public function offsetGet( $key ) { return @$this->array[$key]; }
    public function offsetExists( $key ) { return isset($this->container[$key]); }
    public function offsetUnset($key) { unset($this->container[$key]); }
    
    public function __get( $k ) {
        if ( $k === "count" ) {
            return count($this->array);
        }
    }
    public function __call( $fname , $params ) {
        switch( $fname ) {
            case "count":
                return count($this->array);
            case "each":
                foreach($this->array as $key => &$val) {
                    $params[0]( $key , $val );
                }
        }
    }
}
 
$a = new Class_Array( 1 , 2 , 3 );
echo $a->count(),"\n";
echo $a->count,"\n";
$a[] = 'WhiteMind';
$a[] = 13;
$a->each( function($key , $val) {
    echo "$key => $val\n";
} );
Добавлено через 1 минуту
Хм. интересно. надо будет большинство php array функций переделать под такой вид массива
0
-13 / 2 / 0
Регистрация: 14.08.2014
Сообщений: 240
22.02.2016, 02:02  [ТС]
WhiteMind, __construct в классе lololo возвращает класс info у которого в свою очередь вы спрашиваете установленное ранее имя?
0
Hello Kitty
 Аватар для WhiteMind
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
22.02.2016, 02:06
Цитата Сообщение от AlexBitard Посмотреть сообщение
WhiteMind, __construct в классе lololo возвращает класс info
в конструкцию вида new lololo передается созданный экземпляр класса Info
PHP
1
new Info( 'White' , 'Mind' , 20 )
и помещается кодом конструктора в переменную info экземпляра класса lololo
PHP
1
2
3
    public function __construct( $cl ) {
        $this->info = $cl;
    }
0
-13 / 2 / 0
Регистрация: 14.08.2014
Сообщений: 240
22.02.2016, 02:25  [ТС]
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class zachem_to
{
   __construct($temp)
   {
     $this->babushki = $temp;
   }
}
 
class sex_rate_grandmother
{
   __construct($shag)
   {
     $this->baba_nura = $shag*2;
     $this->baba_glasha $shag*8;
   }
}
 
$temp = new zachem_to(new sex_rate_grandmother(10));
echo 'рейтинг сексуальности бабушки - '.$temp->babushki->baba_nura;
На сколько я понял, это выведет "рейтинг сексуальности бабушки - 20", верно?
Просто я не у ПК, не могу попробовать. Просто хочу понять верно ли я усвоил как это делается

Добавлено через 5 минут
WhiteMind, Если я не прав, поправьте меня пожалуйста до робочего вида.

Это достаточно просто для восприятия. Я думаю это можно использовать для структурирования чего-то большого.
Какой-то схемы.

Например
$MilkyWay->planets->earth->usa->people->president что бы вывело "Obama obezyana"

Так это используется? Для собирания чего-то в один механизм?
0
Hello Kitty
 Аватар для WhiteMind
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
22.02.2016, 02:43
дописал мини класс с массивами
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
<?php
 
class Class_Array implements ArrayAccess {
    private $array = [];
    public function __construct() {
        $this->array = func_get_args();
    }
    public function offsetSet( $key , $value ) { if ( $key === null ) { $this->array[] = $value; } else { $this->array[ $key ] = $value; } }
    public function offsetGet( $key ) { return @$this->array[$key]; }
    public function offsetExists( $key ) { return isset($this->container[$key]); }
    public function offsetUnset($key) { unset($this->container[$key]); }
    
    public function __get( $k ) {
        if ( isset( $this->get_list_call_function[ $k ] ) ) {
            $f = $this->get_list_call_function[ $k ];
            return $f( $this->array );
        }
        return null;
    }
    public function __call( $fname , $params ) {
        if ( isset( $this->func_list[ $fname ] ) ) {
            $info = $this->func_list[ $fname ];
            if ( function_exists( $fname ) || function_exists( $fname = "array_".$fname ) ) {
                array_splice( $params , 0 , 0 , [0] );
                $params[0] = &$this->array;
                foreach($params as &$val) {
                    if ( $val instanceof Class_Array ) {
                        $val = $val->get_array();
                    }
                }
                $ret = call_user_func_array( $fname , $params );
                if ( $info[0] === 1 ) {
                    return $this;
                } elseif ( $info[0] === 0 ) {
                    return $ret;
                }
            }
        }
        return $this;
    }
 
    public function clone() {
        $cl = __CLASS__;
        $n = new $cl;
        $n->set_array( $this->array );
        return $n;
    }
    
    public function &get_array() {
        return $this->array;
    }
    public function set_array( $a ) {
        if ( $a instanceof Class_Array ) {
            $a = $a->get_array();
        }
        $this->array = $a;
        return $this;
    }
    
    public function each( $fun ) {
        foreach( $this->array as $key => &$val ) {
            $fun( $key , $val );
        }
        return $this;
    }
    
    private $get_list_call_function = [
        "count" => "sizeof" ,
        "sizeof" => "sizeof"
    ];
    private $func_list = [
            "change_key_case" => [ "Меняет регистр всех ключей в массиве" ] ,
            "chunk" => [ "Разбивает массив на части" ] ,
            "column" => [ "Return the values from a single column in the input array" ] ,
            "combine" => [ "Создает новый массив, используя один массив в качестве ключей, а другой в качестве соответствующих значений" ] ,
            "count_values" => [ "Подсчитывает количество всех значений массива" ] ,
            "diff_assoc" => [ "Вычисляет расхождение массивов с дополнительной проверкой индекса" ] ,
            "diff_key" => [ "Вычисляет расхождение массивов, сравнивая ключи" ] ,
            "diff_uassoc" => [ "Вычисляет расхождение массивов с дополнительной проверкой индекса, осуществляемой при помощи callback-функции" ] ,
            "diff_ukey" => [ "Вычисляет расхождение массивов, используя callback-функцию для сравнения ключей" ] ,
            "diff" => [ "Вычислить расхождение массивов" ] ,
            "fill_keys" => [ "Создает массив и заполняет его значениями, с определенными ключами" ] ,
            "fill" => [ "Заполняет массив значениями" ] ,
            "filter" => [ "Фильтрует элементы массива с помощью callback-функции" ] ,
            "flip" => [ "Меняет местами ключи с их значениями в массиве" ] ,
            "intersect_assoc" => [ "Вычисляет схождение массивов с дополнительной проверкой индекса" ] ,
            "intersect_key" => [ "Вычислить пересечение массивов, сравнивая ключи" ] ,
            "intersect_uassoc" => [ "Вычисляет схождение массивов с дополнительной проверкой индекса, осуществляемой при помощи callback-функции" ] ,
            "intersect_ukey" => [ "Вычисляет схождение массивов, используя callback-функцию для сравнения ключей" ] ,
            "intersect" => [ "Вычисляет схождение массивов" ] ,
            "key_exists" => [ "Проверяет, присутствует ли в массиве указанный ключ или индекс" ] ,
            "keys" => [ "Возвращает все или некоторое подмножество ключей массива" ] ,
            "map" => [ "Применяет callback-функцию ко всем элементам указанных массивов" ] ,
            "merge_recursive" => [ "Рекурсивное слияние двух или более массивов" ] ,
            "merge" => [ 1 , "Сливает один или большее количество массивов" ] ,
            "multisort" => [ "Сортирует несколько массивов или многомерные массивы" ] ,
            "pad" => [ "Дополнить размер массива определенным значением до заданной величины" ] ,
            "pop" => [ 0 , "Извлекает последний элемент массива" ] ,
            "product" => [ "Вычислить произведение значений массива" ] ,
            "push" => [ 1 , "Добавляет один или несколько элементов в конец массива" ] ,
            "rand" => [ "Выбирает одно или несколько случайных значений из массива" ] ,
            "reduce" => [ "Итеративно уменьшает массив к единственному значению, используя callback-функцию" ] ,
            "replace_recursive" => [ "Рекурсивно заменяет элементы первого массива элементами переданных массивов" ] ,
            "replace" => [ "Замена элементов массива элементами других переданных массивов" ] ,
            "reverse" => [ "Возвращает массив с элементами в обратном порядке" ] ,
            "search" => [ "Осуществляет поиск данного значения в массиве и возвращает соответствующий ключ в случае удачи" ] ,
            "shift" => [ "Извлекает первый элемент массива" ] ,
            "slice" => [ "Выбирает срез массива" ] ,
            "splice" => [ "Удаляет часть массива и заменяет её чем-нибудь ещё" ] ,
            "sum" => [ "Вычисляет сумму значений массива" ] ,
            "udiff_assoc" => [ "Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию" ] ,
            "udiff_uassoc" => [ "Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию" ] ,
            "udiff" => [ "Вычисляет расхождение массивов, используя для сравнения callback-функцию" ] ,
            "uintersect_assoc" => [ "Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию" ] ,
            "uintersect_uassoc" => [ "Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений callback-функцию" ] ,
            "uintersect" => [ "Вычисляет пересечение массивов, используя для сравнения значений callback-функцию" ] ,
            "unique" => [ "Убирает повторяющиеся значения из массива" ] ,
            "unshift" => [ "Добавляет один или несколько элементов в начало массива" ] ,
            "values" => [ "Выбирает все значения массива" ] ,
            "walk_recursive" => [ "Рекурсивно применяет пользовательскую функцию к каждому элементу массива" ] ,
            "walk" => [ "Применяет заданную пользователем функцию к каждому элементу массива" ] ,
            "array" => [ "Создает массив" ] ,
            "arsort" => [ "Сортирует массив в обратном порядке, сохраняя ключи" ] ,
            "asort" => [ "Сортирует массив, сохраняя ключи" ] ,
            "compact" => [ "Создает массив, содержащий названия переменных и их значения" ] ,
            "count" => [ "Подсчитывает количество элементов массива или что-то в объекте" ] ,
            "current" => [ "Возвращает текущий элемент массива" ] ,
            "each" => [ "Возвращает текущую пару ключ/значение из массива и смещает его указатель" ] ,
            "end" => [ "Устанавливает внутренний указатель массива на его последний элемент" ] ,
            "extract" => [ "Импортирует переменные из массива в текущую таблицу символов" ] ,
            "in_array" => [ "Проверяет, присутствует ли в массиве значение" ] ,
            "key_exists" => [ "Псевдоним key_exists" ] ,
            "key" => [ "Выбирает ключ из массива" ] ,
            "krsort" => [ "Сортирует массив по ключам в обратном порядке" ] ,
            "ksort" => [ "Сортирует массив по ключам" ] ,
            "list" => [ "Присваивает переменным из списка значения подобно массиву" ] ,
            "natcasesort" => [ "Сортирует массив, используя алгоритм \"natural order\" без учета регистра символов" ] ,
            "natsort" => [ "Сортирует массив, используя алгоритм \"natural order\"" ] ,
            "next" => [ "Передвигает внутренний указатель массива на одну позицию вперёд" ] ,
            "pos" => [ "Псевдоним current" ] ,
            "prev" => [ "Передвигает внутренний указатель массива на одну позицию назад" ] ,
            "range" => [ "Создает массив, содержащий диапазон элементов" ] ,
            "reset" => [ "Устанавливает внутренний указатель массива на его первый элемент" ] ,
            "rsort" => [ "Сортирует массив в обратном порядке" ] ,
            "shuffle" => [ "Перемешивает массив" ] ,
            "sizeof" => [ "Псевдоним count" ] ,
            "sort" => [ "Сортирует массив" ] ,
            "uasort" => [ "Сортирует массив, используя пользовательскую функцию для сравнения элементов с сохранением ключей" ] ,
            "uksort" => [ "Сортирует массив по ключам, используя пользовательскую функцию для сравнения ключей" ] ,
            "usort" => [ "Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов" ]
        ];
}
 
$a = new Class_Array( 1 , 2 , 3 );
echo $a->count;
$a->each( function( $key , $val ) {
    echo "$key => $val\n";
})->splice(0,0, (new Class_Array('first','next'))->push('one more'))->each( function( $key , $val ) {
    echo "$key => $val\n";
});
http://sandbox.onlinephpfuncti... e02196a53c

Добавлено через 1 минуту
Цитата Сообщение от AlexBitard Посмотреть сообщение
На сколько я понял, это выведет "рейтинг сексуальности бабушки - 20", верно?
http://sandbox.onlinephpfuncti... bb862d1b6a
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
class zachem_to
{
  public function __construct($temp)
   {
     $this->babushki = $temp;
   }
}
 
class sex_rate_grandmother
{
  public function __construct($shag)
   {
     $this->baba_nura = $shag*2;
     $this->baba_glasha =$shag*8;
   }
}
 
$temp = new zachem_to(new sex_rate_grandmother(10));
echo 'рейтинг сексуальности бабушки - '.$temp->babushki->baba_nura;
0
-13 / 2 / 0
Регистрация: 14.08.2014
Сообщений: 240
22.02.2016, 11:26  [ТС]
WhiteMind, Спасибо за помощь, приятель. Интересная штука!
Буду использовать её что-бы закреплять знания.
Скажите, как Вы думаете, логично структурировать таким образом данные или даже функции?
Ну как в примере выше.
$класс->Главная_группа->Подгруппа->Содержимое_подгруппы->Содержимое_содержимого_подгруппы
0
Hello Kitty
 Аватар для WhiteMind
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
22.02.2016, 18:13
Цитата Сообщение от AlexBitard Посмотреть сообщение
$класс->Главная_группа->Подгруппа->Содержимое_подгруппы->Содержимое_содержимого_подгруппы
если имена и структура подгрупп статичны то можно и так.
но лучше наверное
$Главная_группа->подгруппы[Подгруппа]->подгруппы[подгруппа подгруппы]
таким образом 1н класс можно использовать для описания каждой группы, передавая в подгруппы след подгруппы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.02.2016, 18:13
Помогаю со студенческими работами здесь

Непонятное обращение программы к открываемым файлам
При запуске прога открывает файл конфигурации, который лежит в одной папке с ней, что-то считывает и закрывает поток. Затем с пом...

Обращение к классам без "жёстких ссылок"
https://youtu.be/YExnPIHIYSA?list=WL&amp;t=2649 https://youtu.be/YExnPIHIYSA?list=WL&amp;t=2649 (если откроется с начало, то 44 минута) ...

Запретить прямое обращение к скрипту, но разрешить обращение через RewriteEngine
основной файл у меня index.php и в нем уже определяется какой файл подключить, к примеру index.php ...

лабораторная по классам
Доброго вечера ув. гуру. Очень прошу вас помочь написать небольшую программу, связанной с великим ООП, а конкретнее работой с классами....

Вопрос по классам
Вообщем есть два класса, TTriangular и TPoint. В TTriangular есть метод, который должен вводить координаты заданной точки. В TPoint...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru