【发布时间】:2012-04-15 16:35:46
【问题描述】:
我发现自己经常想做的一件事是将大型关联数组,通常从 POST 请求(例如,具有许多输入的注册表单)转换为基于数组中的键的局部变量。如果您经常使用数组中的值,您的代码很快就会充满长变量名和引号。
为了防止小型关联数组出现这种情况,可以这样做:
$username = $_POST['username'];
$password = $_POST['password'];
我不会为了这个例子而逃避它们,以保持一切尽可能整洁,所以请放松。
您也可以这样做:
list($username, $password) = $_POST;
但是如果 $_POST 数组更大怎么办?那么这两种方法都做起来很乏味。要解决这个问题,您可以运行如下循环:
foreach($arr as $key => $value)
{
${$key} = $value;
}
这个方法的问题是它分配了局部变量。如果可以在运行此循环的父类中调用函数并且可以在调用类中访问这些局部变量,那就太好了。想象一个 MVC 设置,其中每个控制器都派生自 Controller 类,模型也是如此。这样做会很好:
$this->localize($_POST);
doWhatever($username) // $username works! Assuming $_POST['username'] is defined
创建这样的方法会导致局部变量只保留在父类中localize() 函数的范围内,所以这不起作用。我一直在做的是通过一项修改运行相同的循环:
foreach($arr as $key => $value)
{
$this->{$key} = $value;
}
这一切正常,但并不能真正解决最初的问题。它没有被括号和引号弄乱的代码,而是到处都是$this->,更不用说它正在分配从未在类中正式定义过的变量。
最后,我的问题是:是否可以创建一个函数,例如我描述的localize(),以便它可以从父类继承但创建相对于子类的局部变量($username 而不是$this->username)。
另外,不管你能不能,这是否被认为是不好的做法?对我来说这似乎有点 hacky,而且你忽略了 OOP 的一些原则。如果是,您是使用解决方案来解决大型关联数组的丑陋和混乱,还是只处理它?
【问题讨论】: