Xpoint
   [напомнить пароль]

Примитивные объекты в PHP?

Метки: [без меток]
2009-07-30 12:28:03 [обр] triumvurat[досье]

Есть обертка-хранилище для переменных, реализация интерфейса ArrayAccess. Задача обертки — содержать в себе данные, уметь считать их, отдавать, в т.ч. null когда запрашивается undefined значение на печать. Работает так:

$get = new ArrayAccessImpl();
$get['a']['1'] = '00001';
$get['a']['2'] = '00002';

print_r($get);
/*
ArrayAccessImpl Object
(
    [data:protected] => Array
        (
            [a] => ArrayAccessImpl Object
                (
                    [data:protected] => Array
                        (
                            [1] => 00001
                            [2] => 00002
                        )
                )
        )
)
*/

var_dump($get['a']['undefined']); // создается и возвращается пустой объект-обертка

echo $get['a']['undefined']; // выведется пустая строка

echo $get['a']->count(); // 3
echo $get['a']->clear(); // очищаем 
echo $get['a']->count(); // 0

Решил я сделать такую фишку для обертки, когда при запрашивании скаляра, его можно было бы транслировать в любой тип. Для этого я создал класс Scalar, который создается каждый раз, когда нужно получить скаляр из обёртки, и в итоге мы получаем вот такой вот Няшный синтаксис:

$get = new ArrayAccessImpl(); // обёртка 
$get['a']['b'] = '00001'; // строка 
echo $get['a']['b']->asString(); // 00001
echo $get['a']['b']->asInt(); // 1
print_r($get['a']['b']->asArray()); // Array ( [0] => 00001 ) 
print_r($get['a']['b']->asHash()); // Array ( [b] => 00001 )

Сам класс Scalar пока предельно прост:

class Scalar implements iScalar
{
    private $var;
    private $key;

    public function __construct($var=null, $key=null)
    {
        $this->var = $var;
        $this->key = $key;
    }

    public function asInt()
    {
        return intval($this->var);
    }

    public function asString()
    {
        return strval($this->var);
    }

    // По умолчанию выводим как строку
    public function __toString()
    {
        return strval($this->var);
    }

    public function asBool()
    {
        return (boolean)$this->var;
    }

    public function asArray()
    {
        return (array)$this->var;
    }

    public function asHash()
    {
        return array($this->key => $this->var);
    }
}

Но при необходимости его можно расширить всякими полезными методами.

Как вам идея? На PHPclube меня апкакали, сказали, что это неясно и будет накладно в плане скорости. Действительно, по сравнению с чистым PHP все это заметно тормозит: операция с 100 000 переменных на чистом PHP без всех этих классов — 0.5 сек, с оберткой ArrayAccessImpl - 3 сек., с классом Scalar - 5 секунд.

Мне очень не нравится, что в PHP примитивные типы не представлены как объекты. Вот JS — это айс. Объекты можно расширять методами.

коды классов на PHP

спустя 1 час 9 минут [обр] Алексей Шоков(6/9)[досье]
Так и пишите на JS. Или на Ruby. Зачем PHP калечить?
спустя 1 минуту [обр] Давид Мзареулян(536/1003)[досье]
Примитивные не представлены, но есть же объекты SPL, которые весьма быстры и вполне расширяемы.
Powered by POEM™ Engine Copyright © 2002-2005