在PHP中获取扩展类的当前工作目录

时间:2012-06-20 10:28:34

标签: php inheritance

我有一个抽象类“Class”。 Subclass类扩展了Class。 Class抽象类具有以下调用:

is_readable('some_file.ext')

如何强制抽象类的子元素在它们所在的文件夹中查找文件而不是父抽象类的文件夹,而不覆盖子元素中的方法?

即。如果摘要在

classes / abstracts / Class.php

并且孩子在

classes / children / Subclass.php,

如何让Subclass.php在classes / children /而不是classes / abstracts中查找some_file.ext,而不在子类中明确定义它?

3 个答案:

答案 0 :(得分:12)

您可以使用ReflectionClass::getFileName()来检索定义子类的文件名。

// In Superclass
public function isReadableFileInClassDir($file='somefile.ext') {
    $reflection = new ReflectionClass($this);
    $directory = dirname($reflection->getFileName()) . PATH_SEPARATOR;

    return is_readable($directory . $filename);
}

这是有效的,因为$this无论在何处定义它都将始终引用实例化的类(而不是它的父级,即使在父级中找到$this)。

答案 1 :(得分:0)

您可以使用以下内容:

is_readable(dirname(__FILE__).DIRECTORY_SEPARATOR.'some_file.ext');

dirname方法返回传递它的文件的目录。

有关__FILE__

的更多信息,请查看Magic constants

修改

在子类中包含一个设置为__FILE__的成员变量,并在抽象类中引用它。

儿童班

var $source_location = __FILE__;

抽象类

is_readable($this->source_location.DIRECTORY_SEPARATOR.'some_file.ext');

答案 2 :(得分:0)

我相信您有充分的理由在您的文件系统中的不同文件夹中保存类和子类,但考虑Zend自动加载或基于命名空间的类加载 - 它会在您的情况下失败...

而不是这个架构:

classes
   | - abstracts
          | - AbstractClass1.php
          | - AbstractClass2.php
   | - children
          | - ChildClass1.php
          | - ChildClass2.php

考虑一下:

classes
   | - AbstractClass1.php
   | - AbstractClass2.php
   | - AnotherClass.php
   | - AbstractClass1
          | - ChildClass1.php
          | - ChildClass12.php
   | - AbstractClass2
          | - ChildClass2.php
          | - ChildClass22.php
   | - AnotherClass
          | - ClassA.php
          | - ClassB.php
          | - ClassB
                | - ClassBA.php

通过这种架构,显然路径ClassBA中的classes/AnotherClass/ClassB扩展ClassB,扩展AnotherClass。现在您可以使用命名空间(当使用PHP 5.3<时)或命名您的类,如class AnotherClass_ClassB_ClassBA { ... }(Zend类命名约定)您可以使用Zend自动加载器(例如)......