php – 根据键将大型关联数组转换为局部变量

前端之家收集整理的这篇文章主要介绍了php – 根据键将大型关联数组转换为局部变量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我发现自己经常想做的一件事是通过数组中的键转换一个大的关联数组,通常是从一个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-&gt ;用户名).

此外,无论你是否可以,这是否被认为是不好的做法?对我来说似乎有点黑客,你忽略了一些OOP的原则.如果是,您是否使用解决方案来修复大型关联数组的丑陋和混乱,还是处理它?

PHP提取功能正是这样做的.将散列提取到本地命名空间中:

http://us3.php.net/extract

一个重要补编:

如果函数采用用户提供的变量名(例如由$_POST提供)来防止现有变量的重新定义,那么请务必使用EXTR_SKIP选项来提取extract():

$myvar = 'abc';
extract($_POST,EXTR_SKIP);  // $_POST['myvar'] won't overwrite $myvar.

猜你在找的PHP相关文章