Предотвратить запуск PHP require_once - PullRequest
3 голосов
/ 06 июля 2010

Отладка чужого PHP-кода, я хотел бы выборочно переопределить один из их классов.Класс включается через:

require_once('classname.php');

Но это появляется в разных местах приложения.Я бы лучше «смоделировал» require_once, чтобы он никогда не запускался вообще.Т.е. просто определите class classname как я хочу.Затем, в следующий раз, когда файл будет require_once 'редактирован, он будет помечен как уже загруженный и, следовательно, не перезагружен.

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

В Perl, что бы я хотелсделать было бы:

$INC{'classname.pm'} = 1;

Есть ли способ получить доступ к PHP-эквиваленту Perl %INC?

Обновление : постоянно удивляется тому, что PHP не делаетпозвольте вам сделать ...

Мой обходной путь должен был использовать runkit runkit_method_redefine.Я загружаю классы, которые пытался предотвратить загрузкой, а затем переопределяю все методы, которые я пытался «смоделировать», например:

require_once('classname.php');
runkit_method_redefine('classname','method','$params','return "testdata";');

Ответы [ 3 ]

2 голосов
/ 06 июля 2010

Место:

<?php return; ?>

в самом верху classname.php файла.

0 голосов
/ 06 июля 2010

Я думаю, что вы имеете в виду, что вполне возможно, что где-то в коде есть еще один "required_once", который может привести к перезаписи вашего.

Есть две вещи, которые вы можете сделать:

1) Найдите первое «обязательное», а затем закомментируйте его.

2) Перейдите в файл класса и включите ваш класс и вернитесь до определения другого класса.

0 голосов
/ 06 июля 2010

Затем, в следующий раз, когда файл был require_once'ed, он будет помечен как уже загруженный и, следовательно, не загружен.

require_once делает это для вас ..

Кроме того, вы можете использовать что-нибудь хакерское, например

if(!class_exists("my_class")) {
  class my_class {}  // define your class here
}
...