クラスとインタフェースPHP間の自動ロードの違い

私は次の問題を探しています。 プロジェクトのクラスファイル名はlogon.class.phpです しかし、そのクラスのインターフェイスファイルの名前はlogon.interface.phpです

私の問題は、autoloadメソッドが実行されるときにクラスコールかインタフェース呼び出しかを検出できるはずです。

<?php 
function __autoload($name){
    if($name === is_class){
        include_once($name.'class.php');
    }elseif ($name === is_interface){
         include_once($name.'interface.php');
    }
}
?>
2
どのようにして同じ名前のクラスとインターフェイスを定義し、両方を使用することができますか?これを実行してみてください: class x {} interface x {}
追加された 著者 Explosion Pills,
私はストーシュも同様にします。私はインターフェイスのIClassName、抽象クラスのAClassName、クラスのCClassnameを持っています。
追加された 著者 F21,
@ tanduが言ったことに加えて、真剣に PSR-0 をご覧ください。真剣に。
追加された 著者 igorw,
私は通常、ファイル名とインターフェイス名の先頭に I を追加します
追加された 著者 Stoosh,
過去には、この接頭辞もインターフェイスの前に使用しました。しかし、今では名前空間の使用で、私はインターフェイスに特有の名前空間を持っています
追加された 著者 Jan Van Looveren,

3 答え

ReflectionClass :: isInterface を使用して、クラスがインタフェースかどうかを判断できます。

$reflection = new ReflectionClass($name);

if ($reflection->isInterface()){
  //Is an interface
}else{
  //Not an interface
}

あなたの場合、おそらく $ name.interface.php$ name.class.phpfile_exist を使用して、それらが存在し、存在するものを要求し、それがインタフェースかどうかを確認します。

しかし、私の意見は、これはトラックの下で問題を引き起こすかもしれないということです。 MyClass.class.phpMyClass.interface.php がある場合はどうなりますか?

3
追加された
これにはクラスのインスタンスが必要です。
追加された 著者 Explosion Pills,
あなたは正しいですが、すでに存在するクラスのためにのみ行うことができます。
追加された 著者 Explosion Pills,
@tandu、ReflectionClass 'コンストラクタはインスタンスを必要としません。クラス名の文字列を渡すことができます。
追加された 著者 F21,
@xdazz:詳細を教えてください:)
追加された 著者 F21,
自動ロードで反射を使用することは非常に悪い考えです。
追加された 著者 xdazz,

クラス名の衝突を避けるために、名前空間を使用できます。 PSR-0の仕様を確認してください。

また、この投稿をチェックしてください。ファイルの内容を読み込む前にそれを読み込んでトークン化することができ、実際にクラス/インタフェースをロードせずに、ファイルにInterfaceまたはクラスが含まれているかどうかを判断できます。インターフェイスとクラスは同じ名前を持つことはできません

注意:このメソッドを使用すると、実行時にインターフェイスの名前を実際に変更することができます(クラスをロードする前に、これは非常に良い方法です)

0
追加された

あなたのクラスやインターフェースにはいくつかの命名規則が必要です。あなたのクラス名は logon で、インターフェイス名は logon_interface です。たとえば、 $ name をアンダースコアで分解し、最後の要素が interface であるかどうかを確認します。

0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com