1

長い説明でごめんなさい...私は徹底するのが好きです。

私はOOPPHPに非常に慣れていませんが(これまでのところ約1週間のコーディング)、かなりうまく理解していて、本当に気に入っています!すべてのクラスを1つのGIANTインクルードファイルに配置し、に格納されているオブジェクトを必要とするすべてのページにインクルードしていましたSESSION。それから今日、これはナビゲートするのが難しく、すべてのページがそれを使用していなくてもすべてのクラスをロードしていることに気づきました。そのため、クラスを独自のファイルに分割するのが最善であるとどこかで読んだときに、すべてのクラスをlibフォルダー内の独自のファイル。

学生クラスはstudent.phpファイルに入りました。スタッフクラスはstaff.phpファイルに入りました。などなど。

ここで私は混乱します...データベースから特定の情報を検索するためにいくつかの工場をプログラムしました。これらの工場は素晴らしい働きをします!タイプ(ID、ユーザー名、アセットなど)を渡すと、ファクトリは適切なルックアップを返し、それを基準に渡すことができます。

これは私が1つの工場で行ったことの例です。ファイル名はdevicelookup.phpです

<?php
// Device Lookup

/*
 *  device lookup interface.  This ensures that each lookup provider has the same function
 */
interface deviceLookupProvider {
    public function lookupDevice($arg);
}

/*
 *  class assetLookupDevice
 */
class assetLookupDevice implements deviceLookupProvider {
    public function lookupDevice($arg) {
        global $mysqli;
        $asset = $mysqli->real_escape_string($arg);
        $sql = "SELECT computer.* FROM `computer` WHERE computer.assetTag = '" . $asset . "' LIMIT 1;";
        $result = $mysqli->query($sql) or die($mysqli->error);
        if ($result->num_rows > 0) {
            return $result->fetch_assoc();
        } else {
            return null;
        }
    }
}

/*
 *  device lookup factory.  This returns a lookup object based off the type.
 */
class DeviceLookupFactory {
    public static function createDeviceLookup($type) {
        switch ($type) {
            case "asset":
                return new assetLookupDevice;
                break;
        }
    }
}

私は次のようにphp.netのコードを使用してspl_autoloaderを実装しようとしています:

function my_autoloader($class) {
    include 'lib/' . $class . '.php';
}

spl_autoload_register('my_autoloader');

この種の関数は、学生、スタッフ、ワークフロー、およびファイルと同じ名前の他のクラスには最適ですが、ファクトリとその実装を/lib内の独自のファイルに分割することに違和感を覚えます。

この種の分解を行う必要がある場合は、それらを独自のフォルダーなどにグループ化してから、名前空間に遭遇します。個々のクラスに名前空間を配置するという概念はある程度理解していますが、理解していません。

そして、名前空間に最適な構造を見つければ、次のように呼び出すことができるはずです。

<?php
spl_autoload_extensions(".php"); // comma-separated list
spl_autoload_register();
?>

必要に応じて、必要なすべてのクラスファイルを魔法のように含めるだけです。

では...この環境をどのように構築するのでしょうか?将来的にOOPではないより大きなアプリケーションのオブジェクトコーディングを再利用できるように、すべてを適切に構造化したいと思います。

4

1 に答える 1

2

IMO、クラスの命名とファイル階層に関しては、PSR-0(完全な仕様を参照)に準拠する必要があります。次に、PSR-0準拠のオートローダーを使用して、独自のオートローダーを作成しないようにすることができます

少なくとも、すべてのクラス、インターフェイス、トレイトは、クラス/インターフェイス/トレイト名とまったく同じ名前の独自のファイルに含まれている必要があります。

于 2013-03-05T16:19:31.890 に答える