这是我得到的功能:
function update_user_information($aUserId, $aName, $aPassword)
如果我想再更新一个属性,我需要做这样的事情:
function update_user_information($aUserId, $aName, $aPassword, $aEmail)
如果用户表保持扩展,我的功能将始终改变,如何使以后更新更简单?谢谢。
答案 0 :(得分:2)
考虑创建一个User类,然后将其作为参数传入。
传入一系列参数会使下一个程序员很难确定预期的参数。
答案 1 :(得分:2)
我会以java风格创建一个Bean 这种方式我认为是保持逻辑简单的更合适的方法 看下面怎么用它
class user{
private $name;
private $userName;
public function update(){
///business logic
}
public function getName(){
return $this->name;
}
public function getUserName(){
return $this->userName;
}
public function setName($name){
$this->name = $name;
}
public function getUserName($userName){
$this->userName = $userName;
}
}
//this is how you user it.
$user = new User();
$user->setName('test');
$user->update();
通过这种方式,您可以添加更多功能,如insert(),clone(),sendMailToUser(),而无需在每个函数中反复处理参数。
答案 2 :(得分:1)
使用字符串数组作为参数:
function update_user_information(array $parameters)
你使用一个类
答案 3 :(得分:1)
最简单的方法是传递一个数组(就像现在已经多次提到的那样)
update_user(array('username' => 'bar'));
但缺点是您的API不再传达更新用户可接受的值。您必须将它放入您的API文档中。当然,每次允许设置新字段时都必须更新。如果所有必需值都已通过,您还需要检查函数内部。
如果您没有使用程序,那么您也可以使用Builder模式
class UserBuilder implements ArrayAccess
{
protected $data;
public function setUsername($username) {
$this->data['username'] = $username;
return $this;
}
public function offsetGet($offset) {
return $this->data[$offset];
}
public function getUser() {
$user = new User; // or whatever you use to create new users
$user->update($this);
return $user;
}
…
这将允许您通过执行
创建全新的用户$userBuilder = new UserBuilder;
$userBuilder->setUsername('foo');
$user = $userBuilder->getUser();
以及更新现有用户:
update_user($userBuilder
->setUsername('bar')
->setOtherProperty('baz')
…
);
Builder的API会告诉开发人员他/她可以设置哪些字段,并且您还可以逐步收集值。使用构建器还将限制创建对象的责任(某些字段可能需要创建更多对象),这比将new
个关键字放在所有位置更好。
如果你有一个User类,它不需要公开它的任何内部结构,并且可以专注于成为一个Information Expert,并且只公开那些对象作为一个整体进行操作的方法。
class User
{
public function update($userBuilder)
{
$this->username = $userBuilder['username'];
…
}
}
请注意,UserBuilder实现了ArrayAccess,因此无论是传递数组还是构建器实例都无关紧要。这也有效:
$user->update(array('username' => 'bar'));
唯一的缺点是,无论何时需要其他字段,您仍然需要向构建器添加新的访问者,但这是为您实现这种方式所带来的灵活性付出的小代价。
答案 4 :(得分:0)
创建更新和用户类。
$ins->update->user(array('username' => 'Thomas'));
当然,你不仅可以制作用户类。
或者您可以传递用户对象。
$user->username = 'Thomas', $ins->update($user);
答案 5 :(得分:0)
我这样做“jQuery”风格:
$some_helper = new some_helper();
$a_user = new stdClass();
$a_user->userID = 1;
$some_helper->update_something($a_user);
abstract class some_helper_class() {
function extend($defaults, $settings) {
foreach($defaults as $key => $value) {
if (!isset($settings->$key)) {
$settings->$key = $value;
}
}
return $settings;
}
}
class some_helper extends some_helper_class{
function update_something($data) {
$defaults = new stdClass();
// $defaults->userID = 1; // required, so we do not set it now
$defaults->name = 'my name';
$defaults->email = 'a@b.com';
$defaults->password = 'secret';
$this->extend($defaults, $data);
$defaults->userID = 1;
// validation is important always
if (count($defaults) != count($data)) {
// Danger ! required values not present.
} else {
// all is well - do your stuff
}
}
}