Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
3 / 3 / 0
Регистрация: 02.10.2011
Сообщений: 61

Представление массивов в виде методов класса

28.02.2013, 12:18. Показов 2208. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Появилась такая потребность обращаться к элементам массивов post,get,cookie,session обращаться как к методам класса.
Т.е.:
к примеру сессия выглядит так:
PHP
1
$_SESSION = array('user' => array('id'=>1,'hash'=>'asdfa'),'entry'=>123);
допустим есть класс Vars, который работает с этими массивами:

PHP
1
2
3
4
5
6
7
8
class Vars{
public $this->elem = null;
 
function __construct($nameArr){
if($nameArr=='sess')$this->elem = $_SESSION;
elseif($nameArr == 'post')$this->elem = $_POST;
....
}
Допустим, нам нужно обратиться к элементу [user][id]. По идее, мы должны обратиться так:
PHP
1
2
$sess = new Vars('sess');
echo $sess->user->id;
Понятное дело, что нужно использовать магические методы. проблема возникает в следующем. метод __get() возвращает $this, что в принципе и логично, когда мы запрашиваем user. Но как дать понять программе, что id это конечный метод и что уже надо возвращать не $this, а именно то значение, которое запрашивается?

может быть пример с echo не совсем удачен, ибо есть метод __toString(); Вопрос вообще относиться и к таким вещам, когда проверяется условие какое-то (это не обязательно будет string).
Например:
PHP
1
if(!$sess->user->id....
и тд..
Надеюсь вопрос понятен
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.02.2013, 12:18
Ответы с готовыми решениями:

Реализовать ввод исходных данных, расчет и вывод данных в виде методов класса. В Main только создание объектов и вызов методов
Всем привет) помогите пожалуйста с заданием "Реализовать ввод исходных данных, расчет и вывод данных в виде методов класса. В Main только...

Использование массивов внутри методов класса
Нужно сделать так, чтобы массив NextBrick можно было использовать в ShowNB. При этом Массив NextBrick может быть либо вне либо внутри ...

Оформить функции в виде методов класса
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <locale.h> struct Stack { int data; struct Stack...

5
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
28.02.2013, 16:09
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
class Vars {
    private $data;
 
    public function __construct(array $data) {
        $this->data = $data;
    }
 
    public function __get($name) {
        $name = (string) $name;
        if (isset($this->data[$name])) {
            $value = $this->data[$name];
 
            if (is_array($value)) {
                return new self($value);
            }
            else {
                return $value;
            }
        }
        else {
            return null;
        }
    }
}
 
$vars = new Vars(array(
    "foo" => 42,
    "bar" => array(
        "lorem" => 10,
        "ipsum" => 20,
    ),
));
 
var_dump(
    $vars->foo,
    $vars->bar->lorem
);
Добавлено через 1 минуту
lapaliv, Понятия не имею, как Вы собрались работать в массивами, как с единым целым значением. Например, если я хочу получить весь массив из $vars->bar в последнем примере.
1
 Аватар для Василий Макогон
270 / 226 / 11
Регистрация: 20.04.2012
Сообщений: 817
28.02.2013, 22:57
PHP
1
2
3
if($nameArr=='sess')$this->elem = $_SESSION;
elseif($nameArr == 'post')$this->elem = $_POST;
....
это говнокод, сам не видишь этого? какие ещё елсеиф? что за sess? пиши уж session.

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

Если так интересно, посмотри как я делал. http://krugozor.svn.sourceforg... zor/Cover/
Открой test.php, поменяй кодировка на win и смотри что может этот набор классов. Основной движок - встроенный класс ArrayAccess и магические методы.
В общем, разберешься. Вот что эта приблуда умеет:
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
<?php
error_reporting(E_ALL);
 
include('./Interface.php');
include('./Abstract/Simple.php');
include('./Abstract/Array.php');
include('./Array.php');
 
// Тесты возможностей класса Cover_Array.
 
echo "> Content var \$array type of Cover_Array:\n";
$array = new Krugozor_Cover_Array( array('foo', 12345, 'element' => array('key' => 'value', 'key2' => 'value2')) );
print_r($array);
echo "\n\n";
 
echo "> echo \$array->item(0);\n";
echo $array->item(0); // foo
echo "\n\n";
 
echo "> echo \$array->element->key;\n";
echo $array->element->key; // value
echo "\n\n";
 
echo "> echo \$array['element']['key'];\n";
echo $array['element']['key']; // value
echo "\n\n";
 
echo "> echo \$array->element->count();\n";
echo $array->element->count(); // 2
echo "\n\n";
 
echo "> echo \$array->element->append('Hellow, PHP!')->item(0);\n";
echo $array->element->append('Hellow, PHP!')->item(0); // Hellow, PHP!
echo "\n\n";
 
echo "> echo \$array->element->count();\n";
echo $array->element->count(); // 3
echo "\n\n";
 
echo "> print_r(\$array->getDataAsArray());\n";
print_r($array->getDataAsArray()); // получаем обычный массив
echo "\n\n";
 
echo "> foreach by \$array->element:\n";
foreach ($array->element as $key => $value) {
    echo "$key => $value \n";
}
echo "\n\n";
 
echo "> \$array->is_array = array(1, 2, 3);\n";
echo "> print_r(\$array->is_array);\n";
$array->is_array = array(1, 2, 3);
print_r($array->is_array); // Cover_Array Object ( [data:protected] => Array ( [0] => 1 [1] => 2 [2] => 3 ) )
echo "\n";
 
echo "> var_dump(\$array->non_exists_prop);\n";
var_dump($array->non_exists_prop); // NULL, никаких Notice
echo "\n";
 
echo "> print_r(\$array['non_exists_prop']);\n";
print_r($array['non_exists_prop']); // Cover_Array Object
echo "\n\n";
 
echo "> \$array['non_exists_prop']['non_exists_prop']['property'] = true;\n";
echo "> print_r(\$array['non_exists_prop']);\n";
$array['non_exists_prop']['non_exists_prop']['property'] = true;
print_r($array['non_exists_prop']); // создалась цепочка вложенных массивов
 
echo "> echo \$array['non_exists_prop']['non_exists_prop'];\n";
echo $array['non_exists_prop']['non_exists_prop']; // string ''
echo "\n\n";
1
3 / 3 / 0
Регистрация: 02.10.2011
Сообщений: 61
01.03.2013, 01:16  [ТС]
Цитата Сообщение от Vovan-VE Посмотреть сообщение
lapaliv, Понятия не имею, как Вы собрались работать в массивами, как с единым целым значением. Например, если я хочу получить весь массив из $vars->bar в последнем примере.
По вашему примеру так и не получится.. я имел в виду что-то вроде метода __toScalar() или __toArray() только своими руками.. видимо не получится так...


Цитата Сообщение от Василий Макогон Посмотреть сообщение
это говнокод, сам не видишь этого? какие ещё елсеиф? что за sess? пиши уж session.
пример писал для понятия идеи...не более того
Цитата Сообщение от Василий Макогон Посмотреть сообщение
Если так интересно, посмотри как я делал. http://krugozor.svn.sourceforg... zor/Cover/
Открой test.php, поменяй кодировка на win и смотри что может этот набор классов. Основной движок - встроенный класс ArrayAccess и магические методы.
В общем, разберешься. Вот что эта приблуда умеет:
за ссылку спасибо..есть чему поучиться, но основу решил сделать все-таки так:
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
class Vars extends Main{
    protected $Path = array();//массив с названием элементов ( к которым обращались)
    protected $Elem = NULL;//текущий массив 
    protected $Isset = true;
    
    function __construct($name){
        $this->Elem = $name;
        return $this;
    }
    
    function __get($name){
        $this->Path[] = $name;
        return $this;
    }
    
    function __set($name,$value){
        $thisElem = &$this->getElement();
        $thisElem[$name] = $value;
    }
    
    function &__call($name, $args){
        
        $thisElem = &$this->getElement();
        
        if(count($args)>0){
            switch($name){
                case 'isset':
                    foreach($args as $v)if(!isset($thisElem[$v]))return 0;
                    $this->reset();
                    return 1;
                case 'unset':
                    foreach($args as $v)unset($thisElem[$v]);
                    $this->reset();
                    return 1;
                case 'set':
                    for($i=0;$i<count($args);$i++){
                        $thisElem[$args[$i]] = $args[$i+1];
                        $i++;
                    }
                    $this->reset();
                    return 1;
            }
        }
        $this->reset();
        return $thisElem[$name];
    }
    
    /*
        получаем ссылку на текущий элемент
    */
    protected function &getElement(){
        //определяем текущий массив
        switch($this->Elem){
            case 'session':
                $thisElem = &$_SESSION;
                break;
            case 'get':
                $thisElem = &$_GET;
                break;
            case 'cookie':
                $thisElem = &$_COOKIE;
                break;
            default:
                $thisElem = &$_POST;
                break;
        }
        //определяем текущий элемент массива
        foreach($this->Path as $v){
            if(!isset($thisElem[$v]))$this->Isset = false;
            $a = &$thisElem[$v];unset($thisElem);
            $thisElem = &$a; unset($a);
        }
        return $thisElem;
    }
    
    /*
        сброс всех настроек
    */
    protected function reset(){
        $this->Path = null;
        $this->Isset = true;
    }
    
    protected function __isset($name){
        $thisElem = &$this->getElement();
        if(isset($thisElem[$name]))return 1;
        else return 0;
    }
}
теперь к элементу можно обращаться так: $session->user->id();

Спасибо, за помощь
0
 Аватар для Василий Макогон
270 / 226 / 11
Регистрация: 20.04.2012
Сообщений: 817
01.03.2013, 10:49
PHP
1
if(!isset($thisElem[$v]))return 0;
надо null возвращать, 0 - это значение.
0
3 / 3 / 0
Регистрация: 02.10.2011
Сообщений: 61
03.03.2013, 23:10  [ТС]
Цитата Сообщение от Василий Макогон Посмотреть сообщение
PHP
1
if(!isset($thisElem[$v]))return 0;
надо null возвращать, 0 - это значение.
спасибо...учтемс =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.03.2013, 23:10
Помогаю со студенческими работами здесь

Реализовать в виде класса набор методов
Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами: 1) Перестановки в n - значном числе первой и...

Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами:
Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами: Дано целое n &gt; 2. Напечатать все простые...

Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами:
Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами: 1) Дано натуральное число N. Если число...

Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами:
Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами: 1) Перестановки в n - значном числе первой и...

Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами
Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами: Даны натуральные числа n, m. Найти все...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
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 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru