Я хотел бы переопределить некоторые функции на PHP, которые уже созданы, например, echo () или time (). Мне не нужно определять эти функции глобально, как раз в рамках одного сценария для тестирования.
Я думаю, что это можно сделать на Perl, но на PHP – возможно ли это?
runkit_function_redefine – Заменить определение функции новой реализацией
Примечание. По умолчанию только функции пользовательского пространства могут быть удалены, переименованы или изменены. Чтобы переопределить внутренние функции, вы должны включить параметр runkit.internal_override в php.ini.
Вы также можете проверить
override_function()
– переопределяет встроенные функции
из пакета отладки Advanced PHP .
Необходимость переопределять собственные функции PHP или формулировки языка должна вызвать звонок. На мой взгляд, это не должно быть частью вашего производственного кода, если вы не пишете отладчик или аналогичный инструмент.
Другой вариант – использовать http://antecedent.github.io/patchwork
Patchwork – это библиотека PHP, которая позволяет переопределять пользовательские функции и методы во время выполнения, свободно реплицируя функциональность
runkit_function_redefine
в чистом PHP 5.3 коде, который, помимо прочего, позволяет вам заменять статические и частные методы на тестовые двойники.
Последнее не работает для собственных функций, хотя
echo
не является функцией, это языковая конструкция. У меня нет ничего для этого.
Но вызовы функций, такие как time()
могут быть переопределены с помощью политики резервного копирования пространства имен PHP-5.3 :
Для функций […] PHP возвращается к глобальным функциям […], если функция с именами […] не существует.
Например, для неквалифицированного time()
вызова функции time()
в не глобальном пространстве имен foo
вы можете предоставить foo\time()
.
Лично я использую это, чтобы высмеять, например, time()
для модульного теста. Я опубликовал эти mocks в библиотеке PHP-Mock :
namespace foo; use phpmock\phpunit\PHPMock; class FooTest extends \PHPUnit_Framework_TestCase { use PHPMock; public function testBar() { $time = $this->getFunctionMock(__NAMESPACE__, "time"); $time->expects($this->once())->willReturn(3); $this->assertEquals(3, time()); } }
поnamespace foo; use phpmock\phpunit\PHPMock; class FooTest extends \PHPUnit_Framework_TestCase { use PHPMock; public function testBar() { $time = $this->getFunctionMock(__NAMESPACE__, "time"); $time->expects($this->once())->willReturn(3); $this->assertEquals(3, time()); } }