2011-09-15 14 views
8

こんにちは私はギターコードのためのライブラリを開発しています。ライブラリ上のいくつかのファイルでは、私はこのようなものを持っている:PHPライブラリを作成する方法、それを独立させるには?

require_once "lib/GuitarChord.php"; 
require_once "lib/Chord.php"; 
require_once "lib/Key.php"; 
require_once "lib/Tuning.php"; 

、それは他のライブラリファイルがどこにある知る必要はありませんので、私はこのライブラリを作ることができますどのように?

この方法で、人は任意のディレクトリにライブラリファイルを置くことができますか?

編集:削除された2番目の質問。

+2

一度に1つの質問をして、できるだけ具体的なものにすることをお勧めします。 – Jon

+0

このライブラリを見る機会はありますか?それはGitHubにありますか? – Gordon

答えて

7

に探して価値があります。例については

:あなたはChordクラスをロードすると、あなたはそれがあなたのlibフォルダ内にある知っていればあなたが行うとき

//AUTOLOADER 
function class_autoloader($class) { 

    // presumes classes are in './classes' 
    $folders = array(
    './', './../', './../../' 
    ); 
    $directories = array(
    'classes','lib', '' 
    ); 
    $dir = dirname(__FILE__); 
    $theClass = '/' . $folderedClass . '.php'; 


    foreach($folders as $folder){ 
     foreach($directories as $directory){ 
      $theInclude = $dir.$folder.$directory.$theClass; 

      if (file_exists($theInclude) && include_once($theInclude)) { 
       return TRUE; 
      } 
     } 
    } 

    trigger_error("The class '$class' or the file '$theClass' failed to spl_autoload ", E_USER_WARNING); 

    return FALSE; 
} 

spl_autoload_register('class_autoloader'); 

その後、オートローダはあなたのための作業を行います。

new Chord(); 

spl_autoload_register

+0

他のファイルがどこにあるのかをライブラリに知らせる方法はありますか?他のファイルは、常にライブラリー・エントリー・ポイントと同じディレクトリーにあります。例えば、 "lib/glib.php"が必要です。 glibはエントリポイントです。他のすべてのファイルはlib /にあるとみなされます。これは可能ですか? – carlosdubusm

+0

@carlos - これは '自動的に'それは 'autoload'と呼ばれます – Neal

1

ライブラリが含まれているクラスのすべてまたはほとんどを使用している場合、ライブラリに関連するすべてのクラスを同じファイルに入れることを検討してください。他のソリューションでは、単にコードを追加することになります。この場合、現在のメソッドを使用するだけです。

ファイルを開発目的で分割したい場合は、引き続きこれを行いますが、簡単に含めることができるようにプロダクション用に1つのファイルにパッケージ化できます。

+0

第1オフ - 私はdownvoteしなかった - 第2 - 私の問題は、**あなたが** BIG **クラスのファイルを作る場合は**あなたが必要としないクラスをロードする可能性がありますオートローダ – Neal

1

すべてのクラスを1つのファイルに含める必要がない場合は、フォルダ名を含める必要があります。 "、

$lib_folder = "lib"; 

require_once $lib_folder . "/GuitarChord.php"; 
require_once $lib_folder . "/Chord.php"; 
require_once $lib_folder . "/Key.php"; 
require_once $lib_folder . "/Tuning.php"; 

データベースの異なる種類を扱うためとして、あなたは、ユーザーが「MYSQL」に設定のどちらかというの$ DB_TYPEのような別の設定を行うことができますあなたはユーザーのみしかし、一度設定していることをどこかでそれを作ることができますFILE "、" XML "などがあります。また、データベースへの呼び出しはswitchステートメントを使用して、使用しているデータベースメソッドを確認し、それに応じて呼び出しを変更します。

編集:また、これらのクラスがあるかもしれないすべての場所のためのオートローダーを作成しますPHP's __autoload feature

0

と多くの異なるオートローダーコールバックを添付することができます。Zend AutoLoader

0

namespacesautoloadersを確認してください。

は、あなたが「GuitarChords」名前空間内のすべてのあなたのクラスを持っていると言うことができます - ので、あなただけの次のような自動ロード機能のものを作成することができます(あなたがオートローダーを登録したファイルを、と仮定すると、「LIB」の親ディレクトリにある):

spl_autoload_register(function($class){ 
     $namespace = explode('\\', $class, 2); 
      if ($namespace[0] === 'GuitarChords' && isset($namespace[1])) { 
      include(__DIR__.DIRECTORY_SEPARATOR.'lib'.DIRECTORY_SEPARATOR.$namespace[1].'.class.php'); 
      } 
    }); 

すべてのライブラリセット/名前空間に1つのオートロード機能を登録する方が良いと思います。 ディレクトリを反復し、include_once、file_existsなどを使用すると、システムの複雑さに応じていくつかの厄介なIOオーバーヘッドが発生する可能性があります。

関連する問題