PHP中不带闭包的函数use语句
因此,我有一个功能,可以输出一个表单,用于编辑用户的配置文件: 这不是我的实际代码,它是一种PHP伪代码 functions.phpPHP中不带闭包的函数use语句,php,closures,scope,global,anonymous-function,Php,Closures,Scope,Global,Anonymous Function,因此,我有一个功能,可以输出一个表单,用于编辑用户的配置文件: 这不是我的实际代码,它是一种PHP伪代码 functions.php function edit_user_form () { $mode = 'edit'; $user_id = get_user_id(); include dirname(__FILE__).'/user-form.php'; } function create_user_form () { $mode = 'create';
function edit_user_form () {
$mode = 'edit';
$user_id = get_user_id();
include dirname(__FILE__).'/user-form.php';
}
function create_user_form () {
$mode = 'create';
include dirname(__FILE__).'/user-form.php';
}
require_once dirname(__FILE__).'/classes/Form.php';
$form = new Form();
?>
<form method="post">
<?php print $mode == 'edit' ? '<input type="hidden" name="user_id" value="'.$user_id.'">' : ''; ?>
<!-- ... -->
</form>
<?php
$form->validation_callback = function ($form) use ($mode) {
if ($mode == 'edit' && !isset($_POST['user_id'])) {
$form->trigger_error('The user_id parameter was not sent.');
}
}
user form.php
function edit_user_form () {
$mode = 'edit';
$user_id = get_user_id();
include dirname(__FILE__).'/user-form.php';
}
function create_user_form () {
$mode = 'create';
include dirname(__FILE__).'/user-form.php';
}
require_once dirname(__FILE__).'/classes/Form.php';
$form = new Form();
?>
<form method="post">
<?php print $mode == 'edit' ? '<input type="hidden" name="user_id" value="'.$user_id.'">' : ''; ?>
<!-- ... -->
</form>
<?php
$form->validation_callback = function ($form) use ($mode) {
if ($mode == 'edit' && !isset($_POST['user_id'])) {
$form->trigger_error('The user_id parameter was not sent.');
}
}
如何在函数的上下文中访问变量
$mode
?显然global$模式
不起作用,因为$mode
不是一个全局变量。如果您不反对使用第一类对象,那么您可以简单地创建一个具有该函数的类
class FormValidator{
protected $mode;
public function setMode($mode) {
$this->mode = $mode;
}
function validateForm($form) {
$somethingToCheck = $this->mode;
}
}
在您的代码中,验证程序执行此操作
//replace this
//$form->validation_callback = function ($form) use ($mode) {
//with this
$formValidator = new FormValidator();
$formValidator->setMode($mode);
$form->validator = $formValidator;
然后,您不需要调用回调,只需调用传递给您的对象上的方法。
它只需要大约6行额外的代码,现在您还有一个第一类对象
在表单类内部,使用已定义的方法调用该类,而不是调用回调
//call_user_func($this->validationCallback, $this);
$this->validator->validateForm($this);
您可以使用
create_函数
并将模式插入函数的代码中:
$form->validation_callback = create_function('$form', '$mode = "'.$mode.'";
if ($mode == "edit" && !isset($_POST["user_id"])) {
$form->trigger_error("The user_id parameter was not sent.");
}
');
但是既然你所做的就是检查$mode
是否是'edit'
,如果不是,就什么都不做,为什么不做类似的事情呢
if ($mode == 'edit') {
$form->validation_callback = create_function('$form', '
if (!isset($_POST["user_id"])) {
$form->trigger_error("The user_id parameter was not sent.");
}
');
}
全局$mode
应该可以工作。虽然它不是全局的,但它位于函数定义的父范围内。不过,更好的方法是将模式传递到函数本身。也许可以制定一个小标准,即第二个参数是一个值的关联数组。甚至只是始终传入值。用户定义函数不关心是否传入额外参数。如果参数不在定义中,则忽略它们。global
不起作用,如下所示:。理想情况下,我不想更改运行call\u user\u func
的类,但我可能不得不这样做。