1

今、私はfile_exists()関数で立ち往生しています。私のプロジェクトはリポジトリから構築されており、1つはDocRootとしてシンボリックリンクされており、その他はinclude_pathを介してphpインタープリターで利用できます。しかし、デフォルトのfile_exists()は、include_pathの下のどこかに配置されているファイルを確認できないため、このfuncをラッパーで再定義するか、独自に作成して他のモジュールに含め、ディレクトリツリー内のこのfuncのすべての一致を置き換える必要があります。 。それは可能ですが、良くはなく、開発者にとっては明確ではありません。

私はすでにpecl-apd(2008)とpecl-runkit(2007)を見てきましたが、私のgentooリポジトリやオーバーレイにはそのようなpeclはもうありません。では、関数を現代的な方法で再定義する方法は?

== upd ===

Ok。もっと深く行きましょう。

/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のフォルダーをプロジェクトに含める必要があります。次に、vhost configを介して〜/reposへのパスをphpinclude_pathに追加します

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

今phpはできます

include ('module1/we_need_this_file_too');

私のリポジトリディレクトリから。ただし、file_exists()に含める前にファイルをチェックしようとすると、file_exists()に対してこれらのディレクトリがまだ閉じられているため、失敗します。これが問題です。

これで、絶対パスを使用した回避策が見つかりました。とにかく、プロジェクトで個人用の構成を作成する必要があります。また、必要なときにchdir()を実行しよう/home/me/repos/としています(そしてvhostでセクションを記述しています<Directory>)が、それは悪い考えでした。

4

2 に答える 2

2

PHPのマニュアルより

PHP は関数のオーバーロードをサポートしておらず、以前に宣言された関数を未定義または再定義することもできません。

すでに述べたように、runkit 拡張機能をインストールしてrunkit_function_redefineを使用する場合、またはAPDをインストールしてoverride_functionを使用する場合は、可能性があります。

于 2011-08-03T11:30:35.180 に答える
1

私は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
于 2012-04-26T10:12:17.127 に答える