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

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

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

Author24 — интернет-сервис помощи студентам
Появилась такая потребность обращаться к элементам массивов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2013, 12:18
Ответы с готовыми решениями:

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

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

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

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

5
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
28.02.2013, 16:09 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
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 3
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  [ТС] 4
Цитата Сообщение от 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 5
PHP
1
if(!isset($thisElem[$v]))return 0;
надо null возвращать, 0 - это значение.
0
3 / 3 / 0
Регистрация: 02.10.2011
Сообщений: 61
03.03.2013, 23:10  [ТС] 6
Цитата Сообщение от Василий Макогон Посмотреть сообщение
PHP
1
if(!isset($thisElem[$v]))return 0;
надо null возвращать, 0 - это значение.
спасибо...учтемс =)
0
03.03.2013, 23:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2013, 23:10
Помогаю со студенческими работами здесь

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

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

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

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

Реализовать в виде класса набор методов для выполнения след.операций с квадратными матрицами размерность n*n
Реализовать в виде класса набор методов для выполнения след.операций с квадратными матрицами ...

Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе работу этих методов
Реализация методов класса. Напишите реализацию методов, предоставляющих доступ к данным ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru