基于键将大关联数组转换为局部变量

Log*_*man 10 php arrays oop

我发现自己经常要做的一件事是将一个大的关联数组转换成一个POST请求(一个注册表单,例如,有很多输入),根据数组中的键转换为局部变量.如果您经常使用数组中的值,您的代码很快就会被长变量名和引号所占据.

为了防止小关联数组,可以这样做:

$username = $_POST['username'];
$password = $_POST['password'];
Run Code Online (Sandbox Code Playgroud)

我不是为了这个例子而逃避它们,以尽可能保持整洁,所以放松一下.

你也可以这样做:

list($username, $password) = $_POST;
Run Code Online (Sandbox Code Playgroud)

但是如果$ _POST数组更大呢?然后,做这两种方法变得乏味.要解决这个问题,你可以像这样运行一个循环:

foreach($arr as $key => $value)
{
    ${$key} = $value;
}
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是它分配局部变量.如果可以在运行此循环的父类中调用函数并且在调用类中可以访问这些局部变量,那将是很好的.想象一下MVC设置,其中每个控制器都来自一个Controller类,同样也适用于模型.这样做会很好:

$this->localize($_POST);
doWhatever($username) // $username works! Assuming $_POST['username'] is defined
Run Code Online (Sandbox Code Playgroud)

创建这样的方法会导致局部变量仅保留在localize()父类的函数范围内,因此这不起作用.我一直在做的是通过一个修改运行相同的循环:

foreach($arr as $key => $value)
{
    $this->{$key} = $value;
}
Run Code Online (Sandbox Code Playgroud)

这有效,但并没有真正解决最初的问题.它不是用括号和引号混乱的代码,而是$this->遍布整个地方,更不用说分配从未在类中正式定义的变量了.

最后,我的问题是:是否可以创建一个像localize()我所描述的函数,这样它可以从父类继承,但相对于子类($username而不是$this->username)创建局部变量.

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

lee*_*ers 18

PHP extract函数就是这样做的.将哈希提取到本地名称空间:

http://us3.php.net/extract

一个重要的附录:

如果函数作用于用户提供的变量名(例如由提供者),请务必使用该EXTR_SKIP选项以防止重新定义现有变量:extract()$_POST

$myvar = 'abc';
extract($_POST, EXTR_SKIP);  // $_POST['myvar'] won't overwrite $myvar.
Run Code Online (Sandbox Code Playgroud)

  • 这正是我所需要的,谢谢。如果您使用“EXTR_SKIP”,似乎非常安全。你使用 PHP 这么多年却错过了这些基本功能,真是太疯狂了……我需要开始更多地阅读手册。 (2认同)