PHP - 变量包含不适用于名称空间内的 include_once
PHP - variable inclusion not working with include_once inside a namespace
我正在使用不同的模式(基本用户名和密码组合以及使用 Yubikey 的另一个模式,目前)对登录页面进行建模。
我的控制器是这样的:
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()
,它会起作用。也许问题在于名称空间的使用和包含外部内容。我从不使用 include()
函数,因为我总是喜欢检查脚本是否已经包含,即使它对额外检查有一点性能损失。
也许我没有完全理解命名空间在 PHP 中是如何工作的,或者我对 array_merge_recursive()
函数做了一些奇怪的事情,但是我看代码越多,发现的东西就越少可能是错误的,我感到有点失落。
谁能帮我解决这个问题?
您的脚本的简单设置显示,include_once 在名称空间内实际上与 include 工作相同。看来,您之前在其他地方包含了 schema.php。
<?php
namespace Document {
include_once "data.php";
echo "Hello " . $data;
}
data.php
<?php
$data = "World";
在您的情况下,您可以添加一些调试输出,以获得 file/line,其中首次包含您的方案。即
var_dump(array_map(function($x) {
return [$x['file'], $x['line']];
}, debug_backtrace()));
但我建议只使用 include
而不是 include_once
和 return 数据,而不是创建新变量。
即scheme.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");
并在需要的地方进行合并(和其他操作)。
我正在使用不同的模式(基本用户名和密码组合以及使用 Yubikey 的另一个模式,目前)对登录页面进行建模。
我的控制器是这样的:
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()
,它会起作用。也许问题在于名称空间的使用和包含外部内容。我从不使用 include()
函数,因为我总是喜欢检查脚本是否已经包含,即使它对额外检查有一点性能损失。
也许我没有完全理解命名空间在 PHP 中是如何工作的,或者我对 array_merge_recursive()
函数做了一些奇怪的事情,但是我看代码越多,发现的东西就越少可能是错误的,我感到有点失落。
谁能帮我解决这个问题?
您的脚本的简单设置显示,include_once 在名称空间内实际上与 include 工作相同。看来,您之前在其他地方包含了 schema.php。
<?php
namespace Document {
include_once "data.php";
echo "Hello " . $data;
}
data.php
<?php
$data = "World";
在您的情况下,您可以添加一些调试输出,以获得 file/line,其中首次包含您的方案。即
var_dump(array_map(function($x) {
return [$x['file'], $x['line']];
}, debug_backtrace()));
但我建议只使用 include
而不是 include_once
和 return 数据,而不是创建新变量。
即scheme.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");
并在需要的地方进行合并(和其他操作)。