2013-02-13 6 views
6

オートロード機能で特性とクラスを区別する方法はありますか?クラスのフォルダと特性のフォルダがあるとします。次のようなことをすることができればうれしいです。PHPのオートロード機能

spl_autoload_register(function($resource) { 
    if (/* $resource is class */) { 
    include 'classes/'.$resource.'.php'; 
    } 
    if (/* $resource is trait */) { 
    include 'traits/'.$resource.'.php'; 
    } 
}); 
+1

あなたはおそらく 'elseif' – shnisaka

+0

がありそうに見えないのお二' if'を変更したいです。コールバックに渡されるシンボル名のほかに情報はありません。おそらくPHPでバグを起こすべきです – Phil

+0

@shnisaka意味がありません。条件が互いに排他的である場合、なぜ 'elseif'を使うのですか? – Phil

答えて

4

オートロードコールバック関数は、1つの情報しか受け取っていません。要求されたシンボル名それはどんなタイプのシンボルであるべきかを見る方法はありません。あなたは何ができるか

stream_resolve_include_path()または類似のものを使用して、クラスや他の形質を処理するために、オートロードスタックに1つずつ、複数の機能を登録しているなど

spl_autoload_register(function($className) { 
    $fileName = stream_resolve_include_path('classes/' . $className . '.php'); 
    if ($fileName !== false) { 
     include $fileName; 
    } 
}); 
spl_autoload_register(function($traitName) { 
    $fileName = stream_resolve_include_path('traits/' . $traitName . '.php'); 
    if ($fileName !== false) { 
     include $fileName; 
    } 
}); 
+0

ありがとう、私の素早い解決策は、 'file_exists()'を使うことでした。私は以前に 'stream_resolve_include_path()'を使ったことは一度もなく、ドキュメントはかなり漠然としています...それは正確に何ですか? 2つのオートロード機能を登録するとどのような利点がありますか? –

+0

@savingerさて、 'include'は設定された' include_path'を使います。 'file_exists()'はこれについて知りませんが、 'stream_resolve_include_path()'はこれを行います。 'include_path'スタックに対して指定されたパスを解決できない場合は' false'を返します – Phil

0

方法あなたの名前に簡単な解決策がありますあなたの特性。私のアプリケーションのすべての形質はtrait_(名前)と命名され、それはclassesフォルダに置かれます。

たとえば、私のtrait_somethingは、ファイル名 "trait.trait_something.php"の下のclasses /フォルダに置かれます。

マイオートロード機能は、特性またはクラスのいずれかを拾うことができます。

function autoloader($class) 
{ 
    $prefix='classes/'; 
    $ext='.php'; 
    if(substr($class,0,6) == 'trait_')include $prefix.'trait.' . $class . $ext; 
    else include $prefix.'class.' . $class . $ext; 
}