Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Extensions > объект как массив


Автор: jzZ 20.8.2006, 13:57
Собственно САБЖ, но не надо ссылок на официальную документацию по SPL, я там читал, но мой английский плох, так что я почти ничего не понял. Лучше на русском, может статейка у кого какая есть smile Однако если у вас нет ссылок на нужную инфу, и вы запостите сюда то как можно этим пользоваться, все равно буду вам благодарен.
Кокректно интересует как обращаться к св-ву объекта так: $obj['a'], работа с объектом как с обычным массивом при помощи функций т.е. array_flip  итд. 
Заранее благодарен!

Автор: ewolf 20.8.2006, 17:28
к свойству объекта можно обратится как

Код

$obj->property = 4; // Присвоение значения
$val = $obj->property; // Чтение значения

Автор: jzZ 20.8.2006, 19:40
ewolf
оффтоп...
Я говорю об этом
Код

$obj['a'] = "lol"; // присвоение значения
$val = $obj['a']; // чтение значения


Добавлено @ 19:45 
Как добиться такого эффекта + использование стандартных функций для работы с объектом как с массивом?!
Насчет функций я вообще неуверен возможно ли это, но точно знаю что возможно использовать foreach для объекта типа так:
foreach($obj as $k => $v)
Об этом прочитать можно тут http://ru.php.net/SPL
Жду помощи, знатоки откликнитесь...

Автор: Mal Hack 20.8.2006, 21:44
jzZ, что ты вообще пытаешься сделать?

Автор: jzZ 20.8.2006, 22:55
Я просто хочу разобраться в новых фичах php5.
А для наглядного примера, допустим так:
Код

<?php
$pages = array(1 => 'index.html', 2 => 'index1.html');
$index = $_GET['index'];
if (($index < 1) or ($index > 2)) {
    $index = 1;
}
?>
<html>
<head>
<title>Site</title>
</head>
<body>
<b>Добрый день!</b>
<br>
<?php
include $pages[$index];
?>
<body>
<html>

Код взят отсюда: http://qdp.ru/2006/06/17/print:page,1,include_v_php.html
Для начала можно было бы реализовать это в классе, причем индекс массива $pages и будет нашим свойством.

Автор: Mal Hack 20.8.2006, 23:18
Цитата(jzZ @  20.8.2006,  23:55 Найти цитируемый пост)
Я просто хочу разобраться в новых фичах php5.

Какое именно?

Автор: jzZ 21.8.2006, 10:17
Mal Hack
Цитата

Я просто хочу разобраться в новых фичах php5.

Цитата

Какое именно? 

Что значит какое именно, ВО ВСЕХ!!! там множественное число...
А сейчас кокретно меня интересует доступ к объекту как к массиву, читай тему, и просьба больше не оффтопить...

Автор: Vaulter 21.8.2006, 10:30
jzZ, хм...
слышал только о таких методах
Код

function __get($prop_name, &$prop_value) 
    {
        if (isset($this->elem[$prop_name])) {
            $prop_value = $this->elem[$prop_name];
            return true;
        } else {
            return false;
        }
    }

    // Callback method for setting a property
    function __set($prop_name, $prop_value) 
    {
        $this->elem[$prop_name] = $prop_value;
        return true;
    }

читай про 
overload() функцию

Автор: Mal Hack 21.8.2006, 12:43
Цитата(jzZ @  21.8.2006,  11:17 Найти цитируемый пост)
А сейчас кокретно меня интересует доступ к объекту как к массиву

Неперь покажи мне, где об этом писалось...
Первый раз в жизни слышу.
Это по сути бред, на самом деле...
Глянь сюда: http://forum.vingrad.ru/index.php?showtopic=107059&hl=

Автор: jzZ 21.8.2006, 15:28
Vaulter
А зачем методу __get() возвращать просто true? Тем более что вызов неопределенной переменной будет таким:
$obj->property; То зачем нужен какой-то сторонний массив elum? Я говорю о таком вызове
Цитата

$obj['a'] = "lol"; // присвоение значения
$val = $obj['a']; // чтение значения

Mal Hack
Об этой ссылке я знаю, если ты не заметил в этом посте был и я )
Совсем не бред, если бы ты внимательно прочитал код предоставленный imm, и прислушался бы к моим утверждениям там (твоя ссылка), ты бы все понял. Писалось между прочи именно там http://forum.vingrad.ru/index.php?showtopic=107059&st=0

Добавлено @ 15:30 
щас колдую над наглядным примером...

Автор: jzZ 21.8.2006, 16:04
Что типа наглядного примера или 'я же вам говорил'.
Перечитал документацию по arrayaccess, однако все равно не понял действия абстрактных методов в интерфейсе arrayaccess.
Код

<?php
Class Pizdec implements ArrayAccess {

    private $link;
    private $nFile;

    public function __construct($nFile = FALSE) {
        $this->nFile = $nFile;
        $this->link = fopen($this->nFile, "w+");
    }
    function __destruct() {
        fclose($this->link);
    }
    public function offsetGet($prop_name) {
        $data = explode("\n", file_get_contents($this->nFile));
        if($data) {
            foreach ($data as $v) {
                if (preg_match("/(".$prop_name."[||])/", $v)) {
                    echo $v;
                }
            }
        } else {
            echo "$prop_name не существует";
            return FALSE;
        }
    }
    public function offsetSET($prop_name, $prop_value) {
        fputs($this->link, $prop_name."||".$prop_value."\n");
        fflush($this->link);
    }
    function offsetExists($prop_name) {
        return TRUE; //ненужный метод
    }
    function offsetUnset($prop_name) {
        fputs($this->link, $prop_name."||:удалено:\n");
        fflush($this->link);
    }
}
$a = new Pizdec("test.txt");
$a['login'] = "jzZ";
$l = $a['login'];
?>

Если кто знает как перебрать объект как массив, буду очень благодарен примеру.

Автор: Alone 21.8.2006, 16:43
Э... не успел... 
Единственным вариантом для тебя будет перебор (ессесно рекурсивный) объекта и создание массива.
(Я не спрашиваю зачем это тебе надо)

Код

<?
$a = &new stdClass();
$a->q = 'qqq';
$a->w = 'www';
$a->z = &new stdClass();
$a->z->e = 'eee';
$a->z->d = 'ddd';

$b = obj2arr($a);

p($b);

function obj2arr($obj){

    $result = array();

    if (is_object($obj)) {

        $params = get_object_vars($obj);

        if (count($params) == 1) {
            return $params[0];
        }

        foreach ($params as $var=>$val) {
            $result[$var] = obj2arr($val);
        }

    }else{
        return $obj;
    }

    return $result;
}

function p($var){
    echo '<pre>';
    print_r($var);
    echo '</pre><hr>';
}

?>





Автор: ewolf 21.8.2006, 17:32
Так как речь идет о php 5, то возможно тебе поможет вот это
http://www.php.net/manual/ru/language.oop5.iterations.php

В этом случае можно, по крайней мере упростить пример Alone

Автор: Alone 21.8.2006, 17:39
Нет. Существенно ничего не поменяется.
Вернее даже абсолютно ничего не поменяется, так как перебор в обоих случаях основан на foreach

Автор: jzZ 21.8.2006, 20:26
Alone
Пример хорший, взял на заметку спасибо. Нафлужу 100 постов кину +
ewolf
Спасибо за ссылку(информативно и на русском) конечно проще, но у alone креативней smile тоже + кину, вот только нафлужу )

Добавлено @ 20:28 
Пока все не разбежались, хотелось бы узнать возможно ли заставить объект крутиться так же как массив, допустим вызовом того же array_map

Автор: Alone 22.8.2006, 10:41
Цитата

Пока все не разбежались, хотелось бы узнать возможно ли заставить объект крутиться так же как массив, допустим вызовом того же array_map


Э... недопонял...
Ты хочешь к свойствам объекта применить callback функцию?

Автор: jzZ 22.8.2006, 12:15
Alone
Да, возможно ли?

Автор: skyboy 29.8.2006, 03:16
[OFF]
jzZ, странные желания smile противоестественные smile
[/OFF]
Цитата(jzZ @  22.8.2006,  11:15 Найти цитируемый пост)
Да, возможно ли? 

Коль сам соберёшь массив свойств - так и обрабатывай его, как знаешь...

Автор: Alone 30.8.2006, 09:55
Цитата

Да, возможно ли? 

Ну, как подсказывают выше, самым что ни на есть противоестественным путем smile
Перегоняешь объект в массив, применяешь к нему калбекфунк. а потом обратно перегоняешь массив в объект... 
Только вот  одно меня чешет: анакойхер это тебе надо? smile Ну просто зудит от любопыцва... smile

Автор: jzZ 30.8.2006, 18:33
Alone
Ну может это покажется странным, но так... на досуге пробую изобрести какой-нибудь интересный метод кэширования на основе классов, вот заодно эксперементирую с ООп в php5

Автор: Opik 31.8.2006, 11:32
А тут все просто. Есть такой интерфейс - ArrayAccess. Пользоваться им очень легко:
Код

  class Example implements ArrayAccess
  {
         protected $data       = array();
         function offsetUnset($offset)
         {
                   unset($this->data[$offset]);
         }

         function offsetGet($offset)
         {
                   return isset($this->data[$offset])? $this->data[$offset]: null;
         }

         function offsetExists($offset)
         {
                    return isset($this->data[$offset]);
         }

         function offsetSet($offset, $value)
         {
                    $this->data[$offset] = $value;
         }
}

$class = new Example;
$class['aaa'] = 'bbb';

Автор: IZ@TOP 4.9.2006, 21:13
jzZ, используй интерфейсы Iterator, ArrayAccess и у тебя все получится. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)