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