关于函数参数


编程时间长了, 就会体会到,真的是一个程序员一种风格. 就是使用同一个框架都会有十个程序员十种编程风格. 好大一部分区别就体现在函数的参数上了.

比如针对一张数据表的操作, 表有id,name,age,status列. 针对此表的插入操作的函数为add. 则就可能有如下几种写法.

<?php
function add1($id, $name, $age, $status){}

function add2($name, $age, $status){}

function add3($name, $age, $status = 1){}

function add4($name, $age, $status = STATUS_OK){}

第一个, 这应该是很新手的程序员. 他在调用的时候会这么写..

<?php
add1('', 'name', 18, 1);

第二个是普通程序员. 大多数人都这么写.

第三个是比普通程序员强一些的. 他们知道参数给定默认值的好处.

第四个知道魔术是什么概念.

再说一个场景. 拿新浪开放平台的某个函数来说吧. 获取access token的那个. 可以有三种方式获取token. 然后, 函数的声明大概是这样的

<?php
function getAccessToken($type, $params){
  switch($type){
    case 'code': break;
    case 'password': break;
  //....
  }
}

其中$param是一个数组, 根据$type的不同,需要传递不同的键进来. 这个函数设计的就是一个非常典型的反面教材. 当使用它的时候, 就需要去看函数声明. 当传递某个$type的时候. $params要传什么…

<?php
getAccessToken('code', array('code' => 'xxxx', 'callback' => 'xxxxxxx'));

getAccessToken('password', array('username' => 'uxxxx', 'password' => 'pxxx'));

getAccessToken('xxxx' , array()); //.....

那怎么才能不写出来这种反面教材的函数呢? 同样拿这个场景. 如下的几个函数

<?php
function getAccessTokenByCode($code, $callback){}

function getAccessTokenByPassword($username, $password){}

function getAccessTokenByXxx($xx1, $xx2, $xx3){}

当然, 你也可以过度设计成一个函数, 接收参数限制为一个接口. 实现三个子类. 由子类返回请求参数… 但….. 感觉好蛋疼的样子…

再举个好的例子. 场景: 一个函数, 批量获取一组用户的信息.

<?php
function getUsersInfo(array $uids){}

当然, 返回值也需要强调一下. 是array(‘uid’ => array(), ‘uid’ => array())这种的…


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注