5

私は現在PHPWebアプリケーションを開発していますが、コードを維持できる方法でファイル(include_once)を含めるための最良の方法を知りたいです。保守可能とは、ファイルを移動したい場合、アプリケーションをリファクタリングして適切に機能させるのは簡単だということです。

私は良いOOPプラクティス(1つのクラス= 1つのファイル)をしようとしているので、たくさんのファイルを持っています。

これが私のアプリケーションの典型的なクラス構造です:

namespace Controls
{
use Drawing\Color;

include_once '/../Control.php';

class GridView extends Control
{
    public $evenRowColor;

    public $oddRowColor;

    public function __construct()
    {
    }

    public function draw()
    {
    }

    protected function generateStyle()
    {
    }

    private function drawColumns()
    {
    }
}
}
4

2 に答える 2

6

私は以前、すべてのphpファイルを次のように開始していました。

include_once('init.php');

次に、そのファイルで、必要に応じて必要な他のすべてのファイルをrequire_onceします。たとえば、functions.phpや、すべてのグローバル変数または定数を宣言するglobals.phpなどです。そうすれば、すべての設定を1か所で編集するだけで済みます。

于 2011-03-23T02:09:15.733 に答える
4

それはあなたが正確に何を達成しようとしているのかによります。

ファイルとファイルが存在するディレクトリの間に構成可能なマッピングが必要な場合は、パスの抽象化を実行し、それを処理するためにいくつかのローダー関数を実装する必要があります。例を示します。

(論理)ディレクトリにあるCore.Controls.Control(物理)ファイルを参照するような表記法を使用するとします。2つの部分からなる実装を行う必要があります。Control.phpCore.Controls

  1. Core.Controls物理ディレクトリにマップされているローダーに指示します/controls
  2. Control.phpそのディレクトリで検索します。

だからここにスタートがあります:

class Loader {
    private static $dirMap = array();

    public static function Register($virtual, $physical) {
        self::$dirMap[$virtual] = $physical;
    }

    public static function Include($file) {
        $pos = strrpos($file, '.');
        if ($pos === false) {
            die('Error: expected at least one dot.');
        }

        $path = substr($file, 0, $pos);
        $file = substr($file, $pos + 1);

        if (!isset(self::$dirMap[$path])) {
            die('Unknown virtual directory: '.$path);
        }

        include (self::$dirMap[$path].'/'.$file.'.php');
    }
}

次のようにローダーを使用します。

// This will probably be done on application startup.
// We need to use an absolute path here, but this is not hard to get with
// e.g. dirname(_FILE_) from your setup script or some such.
// Hardcoded for the example.
Loader::Register('Core.Controls', '/controls');

// And then at some other point:
Loader::Include('Core.Controls.Control');

もちろん、この例は何か便利なことをするための最低限のものですが、それが何をすることができるかを見ることができます。

小さな間違いをした場合はお詫びします。これを入力します。:)

于 2011-03-23T02:11:36.513 に答える