5

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

is_readable('some_file.ext')

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

即如果摘要在

类/摘要/Class.php

孩子在

类/儿童/Subclass.php,

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

4

3 回答 3

14

您可以使用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在父类中找到)。

于 2012-06-20T10:40:17.570 回答
0

您可能可以使用以下内容:

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

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

查看魔术常量以获取更多信息__FILE__

编辑

在子类中包含一个成员变量集__FILE__并引用抽象类中的成员变量。

儿童班

var $source_location = __FILE__;

抽象类

is_readable($this->source_location.DIRECTORY_SEPARATOR.'some_file.ext');
于 2012-06-20T10:33:06.017 回答
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是在 path classes/AnotherClass/ClassBextends ClassBwhich extendsAnotherClass中。现在您可以使用命名空间(当使用 PHP 5.3 < 时)或通过命名您的类class AnotherClass_ClassB_ClassBA { ... }(Zend 类命名约定)您可以使用 Zend 自动加载器(例如)...

于 2012-06-20T10:57:13.853 回答