ОРМ с магией геттеры/сеттеры


Я играл вокруг с PHP, пытаюсь написать небольшой ОРМ. Проработав совсем немного в последнее время с Magento, я влюбился в фотоальбом геттеры/сеттеры, что Magento, я думаю, унаследовала от Zend.

Для тех, кто никогда не видел его в действии, это то, что я говорю о:

$my_object->setSomeProperty('foo');

просто работает, как это делает:

$my_object->getSomeProperty();

что, очевидно, дает "фу".

Так как я пытаюсь реализовать ОРМ, моя цель состоит в том, чтобы предоставить пользователю возможность использовать универсальные функции с одной стороны, где:

$orm_object->setSomeProperty('foo'):

будет карта:

$orm_object->set('some_property', 'foo') // set() would obviously be a generic part of the ORM

по Конвенции.

С другой стороны, если пользователь хочет справиться с некоторыми ситуациями по-разному, он может сделать это определение более конкретно названной функции.

class foo extends ORM {
    function setSome($arg_1, $arg_2)
    {
        …
    }
}

Приведенном выше примере вызов

$orm_object->setSomeProperty('foo')

теперь будет соответствовать

$orm_object->setSome('property', 'foo')

вместо стандартного набора().

У вас есть какие-либо отзывы о моей реализации?

function __call($name, $arguments) {
    if(preg_match('/([a-z]+)/', $name, $matches))
    {
        $action = $matches[0];
        if(preg_match_all('/([A-Z]+)([^A-Z]+)/', $name, $matches))
        {
            $matches = $matches[0];
            array_unshift(&$matches, $action);
            for ($i = count($matches); $i > 0; $i--)
            {
                $potential_func_name = implode('', array_slice($matches, 0, $i));
                if (method_exists($this, $potential_func_name))
                {
                    $arguments_rest = array_slice($matches, $i);
                    break; // found matching function! 
                }
            }

            // handle number of arguments now!
            $reflector = new ReflectionClass($this);
            $num_expected_params = count($reflector->getMethod($potential_func_name)->getParameters());

            $num_expected_params = $num_expected_params - count($arguments);

            $params = array();
            for ($i = $num_expected_params; $i > 1; $i--)
            {
                $params[] = strtolower(array_shift($arguments_rest));
            }

            $last_var = '';
            $i = 0;
            foreach($arguments_rest as $part)
            {
                $last_var .= strtolower($part);
                $i++;
                if ($i != count($arguments_rest)) $last_var .= '_';
            }

            $params[] = $last_var;

            if (count($arguments) == 1) {
                $arguments = array_shift(&$arguments);
            }

            $params[] = $arguments;

            return(call_user_func_array(array($this, $potential_func_name), $params));
        }
    }
}


952
2
задан 23 сентября 2011 в 02:09 Источник Поделиться
Комментарии