0

私はこれを持っています:

class/
    |-- A.Class.php
    |-- FactoryA.php
    |-- Database.php
    |-- Log.php
index.php

FactoryA.php は、Factoryobj A を作成し、データベースから A を作成/読み取り/更新/削除できるクラスです。Log.phpログをテキスト ファイルに送信するクラスですlog.txt

FactoryAA.Class(インスタンスを作成するために) とが必要になりますDatabase。3 つのクラスはすべてLog.php(デバッグ目的で) 必要です。インスタンスindex.phpを作成するFactoryAだけです。

include ステートメントをどこに配置すればよいかわかりません。からincludeすべてのファイル を取得しますか? それとも授業でやりますか? index.php

4

3 に答える 3

3

オートローディングを使用できます。

これは、必要に応じて php 自体がクラスをロードすることを意味します。次のように定義できます。

function __autoload($class_name) {
    include 'class/' . $class_name . '.php';
}

A などの新しいオブジェクトを作成しようとして、A がまだロードされていない場合、autoload が呼び出され、最初のパラメーターが探しているクラスになります。

$a = new A();

http://www.php.net/manual/language.oop5.autoload.php

于 2013-09-12T15:24:57.543 に答える
2

オートローダーを使用しない場合 ( Autoloading Classes を参照)、必要なすべてのファイルをすべての依存ファイルに手動で含める必要があります。通常、すべてのファイルが独自の依存関係をすべて管理することをお勧めします。

あなたの依存関係を理解し​​ていれば、これは次のようになります。

  • Index.phpはFactoryA.phpに必要ですrequire_once
  • FactoryA.phprequire_once A.Class.php & Log.phpになります
  • A.Class.phprequire_onceDatabase.php & Log.phpになります
  • Database.phprequire_onceLog.phpになります

別の方法は__autoload、必要に応じて必要なファイルを使用して取得させることです。したがって、あなたの

function __autoload($class_name) {
    include './class/' . $class_name . '.php';
}
$a = new A();

ただし、spl_autoload_register() は、クラスを自動ロードするためのより柔軟な代替手段を提供します。このため、__autoload() の使用は推奨されておらず、将来的に非推奨または削除される可能性があります。PHP Refを参照してください。

PSR-0 標準を確認することをお勧めします。おそらく、SplClassLoader.php 要点を使用するだけでよいでしょう。

名前空間とパスの標準に従うようにクラスの名前を変更する必要がありますが、次のようにすることができます。

//This is the only file you need to require
require_once('/path/to/SplClassLoader.php');
$classLoader = new SplClassLoader('Class', './class');
$classLoader->register();
$a = new A();

デモンストレーション用の小さな CLI リファレンス プロジェクトを作成し、bubba-h57/AutoLoadingをチェックアウトして、コマンド ラインから実行しました。次のような結果が表示されます。

[cinamon-vm] AutoLoading> php index.php 
From the factory!
From the AClass!
From the Database!
Pure win!

PHP の Autoload 機能が CLI モードで動作しないのはなぜですか?を参照してください。コマンド ライン (cli) スクリプトからオートローダーを使用する方法については、

于 2013-09-12T15:28:10.073 に答える
0

通常、モジュール性は優れていますが、すべてが一貫している場合に限られます。別のログ ファイルが必要な理由がわかりません。

あなたのファイルは本当に整理された ATM ではないと思います。Laravel/CodeIgniter のようなフレームワークの使用を検討しましたか?

それ以外の場合、インクルードするときは、FactoryA にクラス ファイルをインクルードさせてから、FactoryA をインデックス ファイルにインクルードするように、関連するファイルを相互にインクルードします。

于 2013-09-12T15:25:48.757 に答える