Пользовательские классы типов данных - PullRequest
2 голосов
/ 27 июля 2010

Я думаю о создании пользовательских типов данных / прототипов для проекта, над которым я работаю, но мне интересно, если это такая хорошая идея?

Например

class String
{
    var $Value;
    private $escaped = false;

    function __construct($String)
    {
        $this->Value = $String;
    }

    function escape()
    {
        if($escaped === false)
        {
            $this->Value = Registry::get('Database')->escape($this->Value);
        }
        return $this;
    }

    function trim()
    {
        $this->Value = trim($this->Value);
        return $this;
    }

    function __toString()
    {
        return $this->__toString();
    }
}
$myValue = new String('Hello World')->trim()->escape();
//$myValue is now prepared for DB insert

Будут прототипы для Array, Object, String, Resource и т.д ..

с массивами там будет реализовывать Iterator и такие

Некоторые преимущества, которые я имею в виду, это конкретные типы данных для объектов, например

interface Insert
{
    public function Insert(String $Value); //Array / Object / Resource
}

Пользовательские прототипы будут полезны для всех строк.

Но вы думаете, что использование ресурсов превзойдет преимущества?


обновлено для POC

$String = new String('ValueText');

sprintf('Test %s',$String); //Works

trim($String); //Works

base64_encode($String); //Works

Также для массивов идеально подойдет библиотека SPL.

class Array implements ArrayAccess, Iterator, Countable
{
   public function __construct(){}
   public function offsetSet($offset,$value){}
   public function offsetExists($offset){}
   public function offsetUnset($offset){}
   public function offsetGet($offset){}
   public function rewind(){}
   public function current(){}
   public function key(){}
   public function next(){}
   public function valid(){}
   public function count(){}
}

Другая идея - это расширяемые сущности

class DatabaseVariable extends String
{
    function __construct($string)
    {
        parent::__constrcut($string);
    }

    public function escape()
    {
        //Blah
    }
}

Если новый объект расширяет тип данных, он наследует доступные методы для этого типа данных.

Как уже говорилось об автобоксе, это именно та система, которую я ищу, но поскольку она еще не прошла обсуждения, для моего нового проекта (система форума), который я начал на днях, вы думаете, что я должен пойти дальше и использовать свой идея ?, пользователь сможет быстрее взаимодействовать с типами данных, и если есть функция, которая не поддерживает передаваемый объект, мы также можем сделать

$RawResource = $Resourtce->Raw();

//...

$Resource->Set($RawResource);

Ответы [ 2 ]

15 голосов
/ 27 июля 2010

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

Кроме того, разработчик, который унаследует ваш проект, будет вас ненавидеть.

0 голосов
/ 27 июля 2010

Похоже, слишком много проблем для ... казалось бы, никакой пользы.

Если вы беспокоитесь о том, чтобы забыть что-то избежать, прекратите вообще избегать и начинайте использовать параметризованные запросы.

...