Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中不带闭包的函数use语句_Php_Closures_Scope_Global_Anonymous Function - Fatal编程技术网

PHP中不带闭包的函数use语句

PHP中不带闭包的函数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';

因此,我有一个功能,可以输出一个表单,用于编辑用户的配置文件:

这不是我的实际代码,它是一种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';
    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
的类,但我可能不得不这样做。