5

抽象クラス「Class」があります。クラスサブクラスはクラスを拡張します。クラス抽象クラスには次の呼び出しがあります。

is_readable('some_file.ext')

子のメソッドをオーバーライドせずに、抽象クラスの子に、親の抽象クラスのフォルダーではなく、自分がいるフォルダー内のファイルを検索させるにはどうすればよいですか?

つまり、アブストラクトが含まれている場合

classes / abstracts / Class.php

そして子供は

classes / children / Subclass.php、

サブクラスで明示的に定義せずに、Subclass.phpでclasses /abstractsではなくclasses/ children /でsome_file.extを検索するにはどうすればよいですか?

4

3 に答える 3

14

を使用ReflectionClass::getFileName()して、サブクラスが定義されたファイル名を取得できます。

// In Superclass
public function isReadableFileInClassDir($file='somefile.ext') {
    $reflection = new ReflectionClass($this);
    $directory = dirname($reflection->getFileName()) . PATH_SEPARATOR;

    return is_readable($directory . $filename);
}

これが機能$thisするのは、定義されている場所に関係なく、常にインスタンス化されたクラスを参照するためです (親で$this見つかったとしても、親ではありません)。

于 2012-06-20T10:40:17.570 に答える
0

次のようなものを使用できる場合があります。

is_readable(dirname(__FILE__).DIRECTORY_SEPARATOR.'some_file.ext');

dirnameメソッドは、渡したファイルのディレクトリを返します。

詳細については、Magic 定数を参照してください__FILE__

編集

__FILE__子クラスには、抽象クラスに設定されたメンバー変数を含めて参照します。

子クラス

var $source_location = __FILE__;

抽象クラス

is_readable($this->source_location.DIRECTORY_SEPARATOR.'some_file.ext');
于 2012-06-20T10:33:06.017 に答える
0

ファイル システム内の別のフォルダーにクラスとサブクラスを保存する正当な理由があると思いますが、Zend の自動ロードまたは名前空間ベースのクラスの読み込みを検討してください。あなたの場合は失敗します...

このアーキテクチャを持つ代わりに:

classes
   | - abstracts
          | - AbstractClass1.php
          | - AbstractClass2.php
   | - children
          | - ChildClass1.php
          | - ChildClass2.php

このことを考慮:

classes
   | - AbstractClass1.php
   | - AbstractClass2.php
   | - AnotherClass.php
   | - AbstractClass1
          | - ChildClass1.php
          | - ChildClass12.php
   | - AbstractClass2
          | - ChildClass2.php
          | - ChildClass22.php
   | - AnotherClass
          | - ClassA.php
          | - ClassB.php
          | - ClassB
                | - ClassBA.php

このアーキテクチャにより、それがClassBAパスclasses/AnotherClass/ClassBextendsClassBにあり、どれがextends であるかは完全に明らかですAnotherClass。名前空間を使用するか (PHP 5.3 < を使用する場合)、またはclass AnotherClass_ClassB_ClassBA { ... }(Zend クラス命名規則) のようにクラスに名前を付けることで、Zend オートローダーを使用できます (例)...

于 2012-06-20T10:57:13.853 に答える