PHP runkit_function_rename не работает? - PullRequest
4 голосов
/ 27 апреля 2011

Этот код не работает.Почему бы и нет?

<?php
function test()
{
    echo 'test';
}
runkit_function_rename('test', 'test2');
test2();
?>

Что я действительно хочу, так это.Я использую систему, у которой есть функция.Когда я нахожусь на localhost, я хочу, чтобы эта функция делала что-то другое.Я хочу переопределить функцию собственным материалом.

Также приветствуются все альтернативы.

Ответы [ 5 ]

7 голосов
/ 27 апреля 2011

У вас установлено расширение PECL?

http://www.php.net/manual/en/runkit.installation.php

This » PECL extension is not bundled with PHP.
3 голосов
/ 19 апреля 2012

Мне никогда не везло с Ранкитом.

Вы просили альтернативы, и я определенно могу порекомендовать это:

Лоскутная

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

Основное отличие состоит в том, что он написан на чистом PHP - никаких расширений для установки; просто require_once() вверху вашего кода.

Обратная сторона этого заключается в том, что, поскольку он является чистым PHP, он может заменять только функции, определенные в вашей программе; то есть он не может переопределить встроенную функцию PHP, как Runkit. Пример в вашем вопросе будет хорошо работать с Patchwork, но попытка переопределить функцию PHP, такую ​​как mysql_query(), невозможна.

Однако, в отличие от Runkit, он работает отлично, поэтому, если вы можете жить с этим ограничением, я настоятельно рекомендую его.

Другой альтернативой Runkit, которую вы можете попробовать, является PHP Test Helpers . Это расширение PHP, которое охватывает практически то же основание, что и Runkit. Он написан тем же автором, что и PHPUnit, поэтому он должен быть довольно хорошим. Однако у меня не было особой радости, когда я пытался установить это, поэтому я не могу комментировать это очень много.

В ваших комментариях по этому вопросу я отмечаю, что вы используете Windows (то есть WAMP). Ни Runkit, ни PHP Test Helpers не предоставляются с исполняемыми файлами Windows; чтобы использовать любой из них в Windows, вам нужно самостоятельно скомпилировать расширение из исходного кода C. По этой причине, если вы используете Windows, Patchwork - ваш единственный разумный выбор.

1 голос
/ 19 апреля 2012

Кто-то может также столкнуться с тем, что функции runkit_function_ * не работают, хотя библиотека runkit установлена ​​правильно. Это потому, что эти функции не работают для некоторых версий PHP (вероятно, по крайней мере, для всех 5.2. *), Как можно увидеть здесь: https://bugs.php.net/bug.php?id=58205

1 голос
/ 29 апреля 2011

Как объяснялось ранее, вероятно, лучше различать внутри тела функции значение $ _SERVER ['HTTP_HOST'].

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

Этот фрагмент определяет one function get_template_part ():

if($_SERVER['HTTP_HOST'] == 'localhost' {

  function get_template_part() {
  }

} else {

  function get_template_part() {
  }

}

К сожалению, это не поможет в вашем случае, так какget_template_part () уже определено вне вашей досягаемости.

1 голос
/ 27 апреля 2011

Что я действительно хочу, так это Я использую систему, у которой есть функция. Когда я нахожусь на localhost, я хочу, чтобы эта функция делала что-то другое. Я хочу переопределить функцию своими вещами.

Также приветствуются все альтернативы.

function test() {
  if($_SERVER['HTTP_HOST'] == 'localhost' {
     // do one thing
  } else {
     // do other thing
  }
}

Если вы используете runkit, вам нужно будет использовать runkit_function_redefine, а не runkit_function_rename, чтобы одна и та же функция делала разные вещи.

...