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.

?>

现在,我可以做一些 ghetto 的事情,比如添加$this->baseDir = dirname(__FILE__)到每个扩展类,但这似乎有点……ghetto。毕竟,我们谈论的是 PHP 5.3,对吧?这不应该是未来吗?

是否有另一种方法来获取声明类的文件的路径?

4

5 回答 5

5

反射类::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 回答