Справочная информация:
Я создаю автоматизированную среду тестирования для приложения PHP, и мне нужен способ эффективно «заглушить» классы, которые инкапсулируют связь с внешними системами. Например, при тестировании класса X, в котором используется класс-оболочка БД Y, я хотел бы иметь возможность «заменить» «фальшивую» версию класса Y при выполнении автоматических тестов в классе X (таким образом, мне не нужно делать полная настройка + разбор состояния реальной БД в рамках теста).
Проблема:
PHP допускает «условное включение», что означает, в основном, что директивы include / require обрабатываются как часть обработки «основной» логики файла, например ::10000
if (condition) {
require_once('path/to/file');
}
Проблема в том, что я не могу понять, что происходит, когда «основная» логика включенного файла вызывает «возврат». Все ли объекты (определения, классы, функции и т. Д.) Во включенном файле импортированы в файл, который вызывает include / require? Или обработка останавливается с возвратом?
Пример:
Рассмотрим эти три файла:
A.inc
define('MOCK_Z', true);
require_once('Z.inc');
class Z {
public function foo() {
print "This is foo() from a local version of class Z.\n";
}
}
$a = new Z();
$a->foo();
B.inc
define('MOCK_Z', true);
require_once('Z.inc');
$a = new Z();
$a->foo();
Z.inc
if (defined ('MOCK_Z')) {
return true;
}
class Z {
function foo() {
print "This is foo() from the original version of class Z.\n";
}
}
Я наблюдаю следующее поведение:
$ php A.inc
> This is foo() from a local version of class Z.
$ php B.inc
> This is foo() from the original version of class Z.
Почему это странно:
Если require_once () включает в себя все определенные объекты кода, то «php A.inc» должен пожаловаться на сообщение типа
Fatal error: Cannot redeclare class Z
И если require_once () включал в себя только определенные объекты кода до «return», то «php B.inc» должен пожаловаться на сообщение вроде:
Fatal error: Class 'Z' not found
Вопрос:
Может кто-нибудь объяснить точно , что делает PHP, здесь? Это на самом деле важно для меня, потому что мне нужна надежная идиома для обработки включений для «поддельных» классов.