自定义数据类型类

Custom Data-types classes

提问人:RobertPitt 提问时间:7/27/2010 最后编辑:RobertPitt 更新时间:7/27/2010 访问量:7604

问:

我正在考虑为我正在处理的项目制作自定义数据类型/原型,但我想知道这是否是一个好主意?

例如

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 等的原型。

使用数组将实现迭代器等

例如,我想到的一些好处是对象的特定数据类型

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);
PHP 类型 原型

评论

1赞 Artefacto 7/27/2010
您可能会发现有趣的自动装箱提案。阅读那里的讨论,如果你对这是否是一个好主意有很好的论据,并且已经考虑过了,也许你应该在内部邮件列表上开始讨论,以便解决这个问题(据我所知,它还没有在那里讨论过)。
0赞 RobertPitt 7/27/2010
那里的 wiki 没有为我加载 ATM,会调查它
0赞 Charles 7/27/2010
仅供参考,您不需要在问题标题中包含 [括号内的关键字]。这就是标签的用途。
0赞 RobertPitt 7/27/2010
对不起,这是我的一个论坛的 Habbit,很抱歉。
0赞 salathe 7/27/2010
@Artefacto,早在 2005 年,Autoboxing 就在内部列表中进行了讨论,最近在今年 5 月进行了一次非常简短的讨论。

答:

19赞 Scott Saunders 7/27/2010 #1

在我看来,你花在编写这段代码、修复这段代码以及诅咒你不能在类中使用数百个 PHP 函数这一事实上的时间将超过这段代码可能具有的任何优势。

此外,继承您项目的开发人员会讨厌您。

评论

1赞 RobertPitt 7/27/2010
我可以理解继承这个的开发人员可能会像 WTF 一样,但这会使数据类型操作变得非常容易。
0赞 RobertPitt 7/27/2010
此外,使用 toString,它应该与所有 php 函数完全兼容
1赞 Scott Saunders 7/27/2010
想想所有在字符串或数组上工作的内置 PHP 函数 - 实际上有数百个。所有这些都对你毫无用处。PHP 不会使用你的 String 定义来代替它自己的内部字符串系统。字符串在 PHP 中不是一个对象,你不能像在其他 OOP 语言中那样扩展它。
0赞 RobertPitt 7/27/2010
更新了 POC 以供功能使用。
0赞 Scott Saunders 7/27/2010
我正在学习新东西。适用于字符串,数组怎么样?不过仍然看不出任何优势。
0赞 Matti Virkkunen 7/27/2010 #2

听起来太麻烦了......似乎没有好处。

如果您担心忘记转义内容,请完全停止转义内容并开始使用参数化查询。

评论

0赞 RobertPitt 7/27/2010
诸如 segment(0,22) 等类会有更多的内容,它不仅仅是 db 转义,这是我最不担心的,但原理是从 JavaScript 引擎中获取的,并且我认为能够即时操作任何数据类型的好处是好的。