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

Можно ли перезаписать функцию в PHP?

Можете ли вы объявить такую ​​функцию...

function ihatefooexamples(){
  return "boo-foo!";
};

И затем redeclare он несколько похож на этот...

if ($_GET['foolevel'] == 10){
  function ihatefooexamples(){
    return "really boo-foo";
  };
};

Можно ли перезаписать функцию таким образом?

В любом случае?

4b9b3361

Ответ 1

Изменить

Чтобы ответить на комментарии, этот ответ не оригинал вопрос. Если вы попали сюда из Google Search, начните здесь

Существует функция, называемая override_function, которая действительно соответствует счету. Однако, учитывая, что эта функция является частью расширения Advanced PHP Debugger, трудно сделать аргумент, что override_function() предназначен для использования в производстве. Поэтому я бы сказал "Нет", невозможно переписать функцию с намерением, который имел в виду первоначальный вопросник.

Оригинальный ответ

Здесь вы должны использовать ООП, в частности полиморфизм.

interface Fooable
{
    public function ihatefooexamples();
}

class Foo implements Fooable
{
    public function ihatefooexamples()
    {
        return "boo-foo!";
    }
}

class FooBar implements Fooable
{
    public function ihatefooexamples()
    {
        return "really boo-foo";
    }
}

$foo = new Foo();

if (10 == $_GET['foolevel']) {
    $foo = new FooBar();
}

echo $foo->ihatefooexamples();

Ответ 2

Патч обезьяны в пространстве имен php >= 5.3

Менее уклончивым методом, чем изменение интерпретатора, является патч обезьяны.

Патч обезьян - это искусство замены реальной реализации аналогичным "патчем".

Умения ниндзя

Прежде чем вы сможете использовать патч обезьяны, как PHP Ninja, нам сначала нужно понять пространства имен PHP.

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

Если вы не предоставляете пространство имен при вызове функции, PHP сначала просматривает текущее пространство имен, а затем перемещает иерархию до тех пор, пока не найдет первую функцию, объявленную в этом префиксном пространстве имен, и выполнит это. В нашем примере, если вы вызываете print_r(); из namespace My\Awesome\Namespace; Что делает PHP, сначала нужно найти функцию с именем My\Awesome\Namespace\print_r();, затем My\Awesome\print_r();, затем My\print_r();, пока не найдет встроенную функцию PHP в глобальном пространстве имен \print_r();.

Вы не сможете определить function print_r($object) {} в глобальном пространстве имен, потому что это вызовет столкновение имен, поскольку функция с таким именем уже существует.

Ожидайте фатальную ошибку, например:

Fatal error: Cannot redeclare print_r()

Но ничто не мешает вам выполнять только это в рамках пространства имен.

Задание обезьяны

Скажите, что у вас есть script, используя несколько вызовов print_r();.

Пример:

<?php
     print_r($some_object);
     // do some stuff
     print_r($another_object);
     // do some other stuff
     print_r($data_object);
     // do more stuff
     print_r($debug_object);

Но вы позже передумаете, и вы хотите, чтобы результат был заключен в теги <pre></pre>. С тобой случилось?

Прежде чем вы перейдете и измените каждый вызов на print_r();, рассмотрите вместо этого исправление обезьяны.

Пример:

<?php
    namespace MyNamespace {
        function print_r($object) 
        {
            echo "<pre>", \print_r($object, true), "</pre>"; 
        }

        print_r($some_object);
        // do some stuff
        print_r($another_object);
        // do some other stuff
        print_r($data_object);
        // do more stuff
        print_r($debug_object);
    }

Теперь ваш script будет использовать MyNamespace\print_r(); вместо глобального \print_r();

Отлично работает для издевательских модульных тестов.

NJoy!

Ответ 3

Посмотрите override_function, чтобы переопределить функции.

override_function - переопределяет встроенный Функции

Пример:

override_function('test', '$a,$b', 'echo "DOING TEST"; return $a * $b;');

Ответ 4

Вы не можете обновлять любые функции в PHP. Однако вы можете переопределить их. Проверьте функции переопределения, а также функции переименования, чтобы сохранить функцию, которую вы переопределяете, если хотите.

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

Кроме того, если это функции в классах, которые вы хотите переопределить, вам просто нужно создать подкласс и переопределить функцию в своем классе, не выполняя функции rename_function и override_function.

Пример:

rename_function('mysql_connect', 'original_mysql_connect' );
override_function('mysql_connect', '$a,$b', 'echo "DOING MY FUNCTION INSTEAD"; return $a * $b;');

Ответ 5

короткий ответ - нет, вы не можете перезаписать функцию после ее использования в области функций PHP.

лучше всего использовать анонимные функции, такие как

$ihatefooexamples = function()
{
  return "boo-foo!";
}

//...
unset($ihatefooexamples);
$ihatefooexamples = function()
{
   return "really boo-foo";
}

http://php.net/manual/en/functions.anonymous.php

Ответ 6

Я бы включил все функции одного случая в файл include, а остальные в другой include.

Например, simple.inc будет содержать function boofoo() { simple }, а really.inc будет содержать function boofoo() { really }

Это помогает читать/поддерживать вашу программу, имея все функции одного и того же типа в одном и том же inc.

Затем в верхней части основного модуля

  if ($_GET['foolevel'] == 10) {
    include "really.inc";
  }
  else {
    include "simple.inc";
  }

Ответ 7

Вы можете использовать расширение PECL

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

Ответ 9

В зависимости от ситуации, в которой вам это нужно, возможно, вы можете использовать анонимные функции следующим образом:

$greet = function($name)
{
    echo('Hello ' . $name);
};

$greet('World');

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