Патч Monkey в пространстве имен php> = 5.3
Менее уклончивый метод, чем модификация интерпретатора, - это обезьянья заплатка.
Исправление обезьяны - это искусство замены реальной реализации аналогичным «собственным» патчем.
Навыки ниндзя
Прежде чем вы сможете сделать патч для обезьяны, как ниндзя PHP, мы сначала должны понять пространства имен 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 в глобальном пространстве имен * 1022. *.
Вы не сможете определить function print_r($object) {}
в глобальном пространстве имен, потому что это вызовет конфликт имен, так как функция с таким именем уже существует.
Ожидайте фатальную ошибку, например:
Fatal error: Cannot redeclare print_r()
Но ничто не мешает вам делать это в рамках пространства имен.
Исправление обезьяны
Допустим, у вас есть скрипт, использующий несколько print_r();
вызовов.
* +1037 * Пример:
<?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);
Но позже вы передумаете, и вместо этого вы захотите заключить вывод в теги
. С тобой когда-нибудь случалось?
Перед тем как перейти и изменить каждый вызов на print_r();
, рассмотрите вместо этого патчи для обезьян.
Пример: * 1 047 *
<code><?php
namespace MyNamespace {
function print_r($object)
{
echo "<pre>", \print_r($object, true), " ";
}
print_r ($ some_object);
// делать что-то
print_r ($ another_object);
// делать другие вещи
print_r ($ data_object);
// делать больше вещей
print_r ($ debug_object);
}
Ваш скрипт теперь будет использовать MyNamespace\print_r();
вместо глобального \print_r();
Прекрасно подходит для юнит-тестов.
NJoy!