我有一个管理进程,它扫描一些目录和文件以查看某些 php 文件是否扩展了抽象类。所以我的目录结构如下。
/models
/models/Random.php
/models/Payment/Abstract.php
/models/Payment/Cash.php
/models/Payment/Credit.php
/models/Payment/Cheque.php
cash.php、credit.php和cheque.php扩展了abstract.php,分别命名为MyApp_Payment_Cash、MyApp_Payment_Credit、MyApp_Payment_Cheque.php和MyApp_Payment_Abstract。
我需要生成一个数组 array('Cash', 'Credit', 'Cheque');
。我的代码如下:
$aModules = array();
foreach (new DirectoryIterator(APPLICATION_PATH . '/models/Payment') as $oFile) {
if (preg_match('/^(.*)\.php$/', $oFile->getFileName(), $aMatches)) {
$sName = sprintf('MyApp_Payment_%s', $aMatches[1]);
if ($sName instanceof MyApp_Payment_Abstract) {
$aModules[] = $sName;
}
}
}
但这显然行不通(instanceof 在字符串上不能以这种方式工作)。我也尝试过尝试...捕获 new $sName()
但 PHP 在尝试 new MyApp_Payment_Abstract
时抛出了 fatal error 。
正如您可能想到的那样,我正在尝试构建一个可扩展的支付系统,允许将来添加新的支付方式。
我可以将我的正则表达式更改为 /^(?!Abstract|.*)\.php$/
之类的内容,但这对于真正的测试来说似乎是一个相当生硬的工具。
最佳答案
不确定您是否得到了答案,但我发现 php 函数 is_subclass_of 是测试父类(或抽象类)的有效方法:
关于php - 动态打开php文件并检查类是否扩展抽象类(对于自定义模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4730595/