遅い静的バインディングを忘れてください、私は遅い静的__file__が必要です

StackOverflow https://stackoverflow.com/questions/2718820

質問

私は探しています get_called_class() に相当します __FILE__ ...多分何か get_included_file()?

私は彼らが存在するディレクトリを知りたい一連のクラスを持っています。

<?php

class A {

    protected $baseDir;

    public function __construct() {
        $this->baseDir = dirname(__FILE__);
    }

    public function getBaseDir() {
        return $this->baseDir;
    }
}

?>

そして、他のいくつかのファイルでは、他のいくつかのフォルダーで...

<?php

class B extends A {
    // ...
}

class C extends B {
    // ...
}

$a = new A;
echo $a->getBaseDir();

$b = new B;
echo $b->getBaseDir();

$c = new C;
echo $c->getBaseDir();

// Annnd... all three return the same base directory.

?>

今、私はゲットーを追加することができました $this->baseDir = dirname(__FILE__) すべての拡張クラスに、しかしそれは少し...ゲットーのようです。結局のところ、私たちはPHP 5.3について話しているのですよね?これは未来になるはずではありませんか?

クラスが宣言されたファイルへのパスを取得する別の方法はありますか?

役に立ちましたか?

解決

使用しない場合はどうなりますか __FILE__ しかし、別の変数と変数をに設定します __FILE__ 各クラスで

class A {

    protected static $baseDir;
    protected $filename = __FILE__; // put this in every file

    public function __construct() {

    }

    public function getBaseDir() {
        return dirname($this->filename) . '<br>'; // use $filename instead of __FILE__
    }   

}

require('bdir/b.php');
require('cdir/c.php');

class B extends A {
    protected $filename = __FILE__; // put this in every file
}

$a = new A;
echo $a->getBaseDir();

$b = new B;
echo $b->getBaseDir();

$c = new C;
echo $c->getBaseDir();

各クラスのプロパティを再確認する必要がありますが、メソッドではありません

他のヒント

クラスの静的メンバーとして割り当ててみましたか?

<?php
class Blah extends A {
    protected static $filename = __FILE__;
}

(テストされていない、およびstaticsとクラスの継承が非常に楽しくなります...)

使用できます debug_backtrace(). 。ただし、おそらくしたくないでしょう。

テスト済み:

    protected static $filename = __FILE__; 
    static::$filename 

うまくいきません。

クラスがロードされているときに定数が登録されているように見えます。

以前に可能だったかどうかはわかりませんが、今日の私にとって最善のことは、リフレクションを使用することです。

    $basePath = new \ReflectionObject($this);
    $dir = dirname($basePath->getFileName());
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top