Как переопределить функцию в php? - PullRequest
1 голос
/ 03 августа 2011

Теперь я застрял с функцией file_exists ().Мой проект построен из репозиториев, один из них обозначен как DocRoot, другие доступны интерпретатору php через include_path.Но по умолчанию file_exists () не может посмотреть, какие файлы находятся где-то под include_path, поэтому мне нужно или как-то переопределить этот функционал с помощью оболочки или написать свой собственный, включить его в другие модули и заменить все совпадения этого функционала в дереве каталогов,Это возможно, но не очень хорошо и непонятно для разработчиков.

Я уже видел pecl-apd (2008) и pecl-runkit (2007), но среди других больше нет таких peclsмой Gentoo репозиторий или оверлеи.Итак, как переопределить функцию современным способом?

== upd ===

ОК.Давайте углубимся.

Предположим, у нас есть каталог /home/me/repos/, где размещены наши модули git, и виртуальный хост /var/srv/domain.com, где все это собрано

repos_
      \_site_root_
                  \_.git
                   \_file1
       \_module1_
                 \_.git
                  \_we_need_this_file_too
        \_module2_
                  \_.git
domain.com_
           \_htdocs –> ~/repos/site_root
            \_tmp

, поэтому нам нужнокаким-то образом включить в проект папки с модулями 1 и 2.Затем добавьте путь к ~ / repos в php include_path через vhost config

php_admin_value include_path ".:/home/me/repos"

Теперь php может

include ('module1/we_need_this_file_too');

из моего каталога repos.но когда он пытается проверить файл перед включением в file_exists (), он терпит неудачу, потому что эти каталоги все еще закрыты для file_exists (). Это проблема.

Теперь я нашел обходной путь с абсолютными путями, в любом случае мне нужно было бы создать личную конфигурацию в моем проекте.Я также собирался выполнить chdir () в /home/me/repos/, когда это необходимо (и описал секцию <Directory> в vhost), но это была плохая идея.

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Из руководства по PHP

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

Что ж, как вы уже упоминали, вы можете установить расширение runkit и использовать runkit_function_redefine или установить APD и использовать override_function .

1 голос
/ 26 апреля 2012

Я работаю над библиотекой для переопределения функций в php5.3

Источник: https://github.com/Bubujka/bu.defun

Примеры: http://defun.bubujka.org/doc.html

Простое переопределение:

<?php
def('name', function(){ 
    echo "Waserd"; 
});
name();
echo "\n";

def('name', function(){ 
    echo "Bubujka"; 
});
name();

---

Waserd
Bubujka
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...