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

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

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

И затем повторно объявите это несколько как это...

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

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

Какой-либо путь?

62
задан 1 September 2010 в 21:34

10 ответов

Редактирование

Для обращения к комментариям, что этот ответ непосредственно не рассматривает исходный вопрос. Если Вы добрались здесь от Google Search, запустите здесь

существует функция, доступная названа override_function, который на самом деле отвечает всем требованиям. Однако, учитывая, что эта функция является частью Усовершенствованный Отладчик PHP расширение, трудно привести аргумент, который 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 == 

Редактирование

Для обращения к комментариям, что этот ответ непосредственно не рассматривает исходный вопрос. Если Вы добрались здесь от Google Search, запустите здесь

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

Исходный Ответ

Это - то, где необходимо использовать в своих интересах ООП, конкретно полиморфизм.

[110]GET['foolevel']) { $foo = new FooBar(); } echo $foo->ihatefooexamples();
93
ответ дан 31 October 2019 в 13:08

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

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

исправление Обезьяны является искусством замены фактической реализации с подобным собственным "патчем".

навыки Ниндзя

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

Начиная с 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()

, Но ничто не останавливает Вас, однако, от выполнения просто этого в рамках пространства имен.

Исправление обезьяны

Говорит, что у Вас есть сценарий с помощью нескольких 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);

, Но Вы позже передумали, и Вы хотите вывод, перенесенный в [1 111] теги вместо этого. Когда-нибудь произошедший с Вами?

, Прежде чем Вы пойдете и измените каждый вызов на [1 112], рассматривают обезьяну, исправляющую вместо этого.

Пример:

<?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);
    }

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

, Работает отлично для насмешки модульных тестов.

nJoy!

62
ответ дан 31 October 2019 в 13:08

Взгляните на телефон override_function для переопределения функций.

override_function — Переопределяет встроенные функции

Пример:

override_function('test', '$a,$b', 'echo "DOING TEST"; return $a * $b;');
25
ответ дан 31 October 2019 в 13:08

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

Ваше лучшее из использования анонимных функций как так

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

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

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

13
ответ дан 31 October 2019 в 13:08

Вы не можете повторно объявить функции в 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;');
11
ответ дан 31 October 2019 в 13:08

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

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

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

Затем наверху Вашего основного модуля

  if (

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

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

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

Затем наверху Вашего основного модуля

[110]GET['foolevel'] == 10) { include "really.inc"; } else { include "simple.inc"; }
5
ответ дан 31 October 2019 в 13:08

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

  • runkit_function_redefine , — Заменяют функциональное определение новой реализацией

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

3
ответ дан 31 October 2019 в 13:08

Нет это будет проблемой. Переменные Функции PHP

1
ответ дан 31 October 2019 в 13:08

Решение для связанного случая, где у Вас есть включать файл A, который можно отредактировать и хотеть переопределить некоторые его функции во включать файле B (или основном файле):

Основной Файл:

<?php
$Override=true; // An argument used in A.php
include ("A.php");
include ("B.php");
F1();
?>

Включают Файл A:

<?php
if (!@$Override) {
   function F1 () {echo "This is F1() in A";}
}
?>

Включают Файл B:

<?php
   function F1 () {echo "This is F1() in B";}
?>

Просмотр к основным дисплеям файла" Это - F1 () в B".

1
ответ дан 31 October 2019 в 13:08

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

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

$greet('World');

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

0
ответ дан 31 October 2019 в 13:08

Другие вопросы по тегам:

Похожие вопросы: