Переопределить встроенные функции PHP - PullRequest
20 голосов
/ 24 февраля 2010

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

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

Ответы [ 3 ]

17 голосов
/ 24 февраля 2010

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

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

6 голосов
/ 24 февраля 2010

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

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

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

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

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

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

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

1 голос
/ 27 ноября 2014

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

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

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

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

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