利用Yii框架中的collections體驗PHP型別化程式設計

x3d發表於2015-05-12

注: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);


相關文章