2011-01-18 11 views
0

私の質問をどのように公式化するかはわかりませんので、あまり有益ではないこのタイトルのために事前に申し訳ありません。
ここに問題があります。私は同じディレクトリにいくつかのファイルを持っている、それらのそれぞれはクラスの所有者です。私がクラスのいずれかを継承するとき、私はどのファイル(またはフォルダのようなもの)を知る必要があるのですか?
私が来た解決策は本当に好きではありませんが、正確に何を意味するのかをまだ示していません。拡張工事からの子クラス情報の取得

foo.php

class Foo { 
} 

bar.php

include_once 'bootstrap.php' ; 

class Bar extends Foo { 
} 

$bar = new Bar() ; 

bootstrap.phpの

function __autoload($class) { 
    $trace = debug_backtrace() ; 
    // Here i've got the directory i need: 
    $folder = dirname($trace[ 0 ][ 'file' ]) ; 
} 

フォルダ名を取得するために、他の(適切な)方法はそれdebug_backtrace原因があり、実際にはこの種の操作のためのものではありません。また、パフォーマンスの観点からも良いものではありません。

制限:PHP 5.2.12

+0

はこれがありますdebug_backtrace()の完全に許容される使用。 PHPのマニュアルページには、同様の目的でそのマニュアルを使用している人の例がたくさんあります。 –

+0

見つかったディレクトリ名をどのように使用するかを説明してください。すべての目的。 –

答えて

0

$folder = dirname(__FILE__)のために働く必要は仕事をしないのですか?

+0

いいえ、どこにでもブートストラップを置くことができます。親クラスが呼び出されているディレクトリを正確に知る必要があります – kos

0

__FILE__マジック定数は(PHP docsを参照)、それがで呼び出されたファイルの(パスを含む)ファイル名を報告します。

__FILE__:ファイルのフルパスとファイル名を。インクルードの内部で使用された場合、インクルードされたファイルの名前が返されます。 PHP 4.0.2以来、__FILE__には常にsymlinkが解決された絶対パスが含まれていましたが、古いバージョンでは状況によっては相対パスが含まれていました。

つまり、クラスファイル名を返すメソッドを作成できます。例えば

、 'テストフォルダ/ Foo.php' に:

class Foo { 

    function getFile() { 
     return __FILE__; 
    } 

} 

そしてBar.php`」に:

include 'test-folder/Foo.php'; 

class Bar extends Foo { 

    function getParentFile() { 
     return parent::getFile(); 
    } 

} 

$bar = new Bar(); 

echo dirname($bar ->getParentFile()); 
// result: C:\wamp\www\test-folder 

EDIT:[OK]を、ので、もしあなたが見つけたいです親クラスがどこにある前は、それを作成するから、これは(Reflectionを使用して)動作するはずです:

$reflectedBar = new ReflectionClass('Bar'); 
$reflectedBarParent = $reflectedBar->getParentClass(); 
$filename = $reflectedBarParent->getFileName(); 
+0

いいえ、__FILE__には現在のファイルパスが含まれています。そして、継承の前に使用することはできません。だから私はバークラスで使用することはできません。 – kos

+0

いいえ、親クラスにメソッドを作成し、そのメソッドを "parent :: getFile()"(または何でも)を子クラスから呼び出すと、親ファイルの場所が報告されます。 – Hamish

+0

私のタイトルの間違い。この例はより正確です。私は親クラスは必要ありません、それは私が必要とする子クラスです。 – kos

関連する問題