Можно ли объявить функцию как это...
function ihatefooexamples(){
return "boo-foo!";
};
И затем повторно объявите это несколько как это...
if ($_GET['foolevel'] == 10){
function ihatefooexamples(){
return "really boo-foo";
};
};
Действительно ли возможно перезаписать функцию тот путь?
Какой-либо путь?
Для обращения к комментариям, что этот ответ непосредственно не рассматривает исходный вопрос. Если Вы добрались здесь от 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();
А менее уклончивый метод, чем изменение интерпретатора является патчем обезьяны.
исправление Обезьяны является искусством замены фактической реализации с подобным собственным "патчем".
, Прежде чем Вы будете мочь патч обезьяны как Ниндзя 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!
Взгляните на телефон override_function
для переопределения функций.
override_function — Переопределяет встроенные функции
Пример:
override_function('test', '$a,$b', 'echo "DOING TEST"; return $a * $b;');
короткий ответ не, Вы не можете перезаписать функцию однажды в объеме функции PHP.
Ваше лучшее из использования анонимных функций как так
$ihatefooexamples = function()
{
return "boo-foo!";
}
//...
unset($ihatefooexamples);
$ihatefooexamples = function()
{
return "really boo-foo";
}
Вы не можете повторно объявить функции в 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;');
Я включал бы все функции одного случая в 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";
}
Вы могли использовать расширение PECL
runkit_function_redefine
, — Заменяют функциональное определение новой реализацией , но это - плохая практика, по-моему. Вы используете функции, но проверяете шаблон разработки Декоратора. Может одолжить основную идею у него.
Нет это будет проблемой. Переменные Функции PHP
Решение для связанного случая, где у Вас есть включать файл 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".
В зависимости от ситуации, где Вам нужно это, возможно, можно использовать анонимные функции как это:
$greet = function($name)
{
echo('Hello ' . $name);
};
$greet('World');
... затем можно установить новую функцию на данную переменную любое время