включение переменной не работает с include_once внутри пространства имен

Я моделирую страницу входа, используя разные схемы (основное имя пользователя & комбинация пароля и другая схема с использованием 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() функции, но чем больше я смотрю на код, тем меньше я нахожу что-то потенциально неправильное и чувствую себя немного потерянным.

Может кто-нибудь помочь мне понять это?

3

Решение

Простая настройка вашего скрипта, показала, что include_once внутри пространств имен фактически работает так же, как и include. Похоже, вы включали schema.php где-то еще раньше.

<?php

namespace Document {
include_once "data.php";

echo "Hello " . $data;
}

data.php

<?php

$data = "World";

В вашем случае вы можете добавить отладочный вывод, чтобы получить файл / строку, которая включала вашу схему в первый раз. То есть

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

Но я бы порекомендовал include вместо include_once и вернуть данные, вместо того, чтобы создавать новые переменные.

То есть 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");

и сделайте свое слияние (и другие вещи), где вам это нужно.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]