Подтвердить что ты не робот

Переопределить встроенные функции PHP

Я хотел бы переопределить некоторые функции в PHP, которые уже созданы, например, echo() или time(). Мне не нужно определять эти функции глобально, как раз в пределах одного script для тестирования.

Я думаю, что это можно сделать в Perl, но в PHP - возможно ли это?

4b9b3361

Ответ 1

runkit_function_redefine - Замените определение функции новой реализацией

Примечание.. По умолчанию только функции пользовательского пространства могут быть удалены, переименованы или модифицирована. Чтобы переопределить внутренние функции, вы должны включить настройка runkit.internal_override в php.ini.

Ответ 2

Вы также можете проверить

override_function() - переопределяет встроенные функции

из пакета Advanced PHP debugger.

Необходимость переопределения собственных функций PHP или операторов языка должна звучать как звонок тревоги. Это не должно быть частью вашего производственного кода, на мой взгляд, если вы не пишете отладчик или аналогичный инструмент.

Другой вариант - использовать http://antecedent.github.io/patchwork

Patchwork - это библиотека PHP, которая позволяет переопределить пользовательские функции и методы во время выполнения, свободно реплицируя функциональность runkit_function_redefine в чистом PHP 5.3 коде, который, помимо прочего, позволяет вам заменять статические и частные методы с двойными испытаниями.

Последнее не работает для собственных функций, хотя

Ответ 3

echo не является функцией, это языковая конструкция. У меня нет ничего для этого.

Но вызовы функций, такие как time(), могут быть переопределены, поскольку Политика резервного копирования пространства имен PHP-5.3:

Для функций [...] PHP будет возвращаться к глобальным функциям [...], если функция с именами [...] не существует.

например. для неквалифицированного вызова функции time() в не глобальном пространстве имен foo вы можете предоставить foo\time().

Лично я использую это, чтобы издеваться, например. time() для unit test. Я опубликовал эти издевательства в библиотеке 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());
    }
}