• 利用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);
    
  • 相关阅读:
    第十六周总结
    第十五周学习进度
    输出最长字符串链
    第二阶段冲刺10
    第二阶段冲刺09
    第二阶段冲刺08
    输入法评价
    第十四周进度总结
    collections模块
    shutil模块(了解)
  • 原文地址:https://www.cnblogs.com/x3d/p/php-typed-programming.html
Copyright © 2020-2023  润新知