【问题标题】:Forget late static binding, I need late static __FILE__忘记后期静态绑定,我需要后期静态 __FILE__
【发布时间】:2011-02-12 17:06:30
【问题描述】:

我正在寻找与__FILE__ 等效的get_called_class() ... 可能类似于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-&gt;baseDir = dirname(__FILE__),但这似乎有点……贫民区。毕竟,我们谈论的是 PHP 5.3,对吧?这不应该是未来吗?

还有其他方法可以获取声明类的文件的路径吗?

【问题讨论】:

  • 我认为唯一的方法是“贫民窟”,但你为什么要这样做,也许还有另一种解决问题的方法?
  • @Josiah 这是应用程序的视图层。每个视图对象(通常)由一个视图类和一个视图模板文件组成。在上面的示例中,A、B 和 C 是视图类。每个在其父目录中都有一个匹配的模板文件。不过,最好定义一次所述目录,而不是每次都...

标签: php inheritance php-5.3 late-static-binding


【解决方案1】:
【解决方案2】:

您是否尝试将其分配为类的静态成员?

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

(未经测试,静态加类继承变得非常有趣...)

【讨论】:

    【解决方案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 5.3,则可以通过在每个扩展类中声明来存储 dirname(__FILE__) 的等效项:protected $dirName = DIR;
    【解决方案4】:

    您可以使用debug_backtrace()。不过,您可能不想这样做。

    【讨论】:

      【解决方案5】:

      测试:

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

      不起作用。

      看起来常量是在加载类时注册的,而不是“迟到”。

      以前不确定这是否可行,但今天对我来说最好的是使用反射:

          $basePath = new \ReflectionObject($this);
          $dir = dirname($basePath->getFileName());
      

      【讨论】:

      • 快到了!您还可以通过使用后期静态绑定+反射类来避免$this(在静态方法的情况下),例如(new \ReflectionClass(static::class))-&gt;getFileName()
      猜你喜欢
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 2010-09-10
      • 1970-01-01
      • 2012-04-21
      • 2019-01-16
      相关资源
      最近更新 更多