遅い静的バインディングを忘れてください、私は遅い静的__file__が必要です
-
01-10-2019 - |
質問
私は探しています 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());
所属していません StackOverflow