我有一个抽象类“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,而不在子类中明确定义它?
答案 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__
修改
在子类中包含一个设置为__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自动加载器(例如)......