5

私は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について話しているのですよね?これは未来ではないですか?

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

4

5 に答える 5

5

ReflectionClass :: getFileName

于 2011-11-02T19:17:57.957 に答える
3

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

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

(テストされておらず、静的とクラスの継承が非常に楽しくなります...)

于 2010-04-27T04:55:37.877 に答える
1

個別の変数を使用せず、各クラスで__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();

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

于 2010-04-27T06:15:38.663 に答える
0

debug_backtrace()を使用できます。しかし、おそらくあなたはしたくないでしょう。

于 2011-02-17T17:21:26.220 に答える
0

テスト済み:

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

動作しません。

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

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

    $basePath = new \ReflectionObject($this);
    $dir = dirname($basePath->getFileName());
于 2017-01-30T15:21:18.550 に答える