gpt4 book ai didi

PHP - 变量包含不适用于 namespace 内的 include_once

转载 作者:搜寻专家 更新时间:2023-10-31 21:25:57 24 4
gpt4 key购买 nike

我正在使用不同的模式(基本用户名和密码组合以及使用 Yubikey 的另一个模式,目前)对登录页面进行建模。

我的 Controller 看起来像这样:

namespace Document {
/**
* get the current authentication schema
*/
$schema = \Modules\Backend\Authentication::getSchema();

/**
* initialize the template data
*/
if (empty($data)) {
$data = [];
}

/**
* include the document content block
*/
$data = array_merge_recursive($data, [
"document" => [
"sections" => [
/* further content goes here */
]
]
]);

/**
* include the authentication schema content block
*/
if (file_exists($schema = "{$_SERVER["DOCUMENT_ROOT"]}/pages/controllers/backend/login/{$schema}.php")) {
include_once($schema);
}

/**
* output the document content
*/
echo \Helpers\Templates::getTemplate("backend/pages/login", $data);

/**
* free all used resources
*/
unset($data, $schema);
}

身份验证模式如下所示:

/**
* include the document content block
*/
$data = array_merge_recursive(!empty($data) ? $data : [], [
"document" => [
"sections" => [
"schema" => [
"content" => [
"token" => \Helpers\Strings::getToken(),
/* rest of content block goes here */
],
"strings" => [
"title" => _("This is a sample string"),
/* rest of translation strings block goes here */
]
]
]
]
]);

我遇到的问题是 include_once() 对我不起作用,因为 $data 变量在身份验证模式或相反的情况下都没有真正看到(文档命名空间在包含时看到来自身份验证模式的任何内容)。

但是,如果我使用 include() 它会起作用。也许问题在于 namespace 的使用和包含外部内容。我从不使用 include() 函数,因为我总是喜欢检查脚本是否已被包含,即使额外检查会降低性能。

也许我没有完全理解命名空间在 PHP 中是如何工作的,或者我用 array_merge_recursive() 函数做了一些奇怪的事情,但是我看代码越多,我发现的潜在问题就越少错了,我觉得有点失落。

谁能帮我解决这个问题?

最佳答案

您的脚本的一个简单设置显示, namespace 内的 include_once 实际上与 include 一样工作。看来,您之前在其他地方包含了 schema.php。

<?php

namespace Document {
include_once "data.php";

echo "Hello " . $data;
}

数据.php

<?php

$data = "World";

在您的情况下,您可以添加一些调试输出,以获取第一次包含您的方案的文件/行。即

var_dump(array_map(function($x) {
return [$x['file'], $x['line']];
}, debug_backtrace()));

但我建议只使用 include 而不是 include_once 并返回数据,而不是创建新的变量。

即方案.php

return [
"document" => [
"sections" => [
"schema" => [
"content" => [
"token" => \Helpers\Strings::getToken(),
/* rest of content block goes here */
],
"strings" => [
"title" => _("This is a sample string"),
/* rest of translation strings block goes here */
]
]
]
]
];

然后将它包含在

$data = include($schema . '.php");

并在需要的地方进行合并(和其他操作)。

关于PHP - 变量包含不适用于 namespace 内的 include_once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36131132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com