利用Yii框架中的collections体验PHP类型化编程

注:20150514

看过
惠新宸 关于PHP7的PPT后,看到了这一特性将被支持。

Scalar Type Declarations

function foo(int num)

function bar (string name)

function foobar() : float {}

function add(int l, int r) : int {}

class A {
    public function start (bool start) {} 
}

Return Type Declarations

function foo(): array { 
    return [];
}

interface A {
    static function make(): A; 
}

function foo(): DateTime { 
    return null;
}

//PHP Fatal error: Return value of foo() must be an instance of DateTime, null returned

最近有些迷恋类型化编程,甚至因为OSX上无法编译安装hhvm准备再拿一台机器装Linux来跑。

在折腾期间,想起PHP本身对形参的类型化支持 - array与object,其实可以通过定义一些基础类来解决PHP不能支持基础类型形参的问题。以前也整理过一篇文章谈过这个问题:http://www.cnblogs.com/x3d/p/4285787.html

Yii中其实针对集合数据,做了一些实现与封装,如CList、CMap、CTypedList、CTypedMap,基本实现类型化数组数据的指定,但还缺乏对基础类型的封装,如int、string等。

接前面一篇博文,调用实例为:

$name = 'jimmy';
//findUserByName($name); // PHP Catchable fatal error:  Argument 1 passed to findUserByName() must be an instance of CString, string given

$name = new CString($name);
findUserByName($name);

$id = 10000;
//findUserById($id); // Catchable fatal error: Argument 1 passed to findUserById() must be an instance of CInteger, integer given

$id = new CInteger($id);
findUserById($id);

而对于集合类数据,则借助于集合类。

function findUsersByNames(CTypedList $names) {
    //code
}

$names = new CTypedList('CString');
$names[] = new CString('jimmy');
$names[] = new CString('tommy');
findUsersByNames($names);
posted @ 2015-05-12 23:33  x3d  阅读(398)  评论(1编辑  收藏  举报