我在自动加载未正确命名的类时遇到问题。虽然我们的开发人员总是使用 Java 风格的文件名与类相同的方法,因此自动加载功能是微不足道的,但当HybridAuth出现时,我们突然感到头疼。
为了记录,他们的命名系统是这样的:
- Hybrid_Auth存在于Hybrid/Auth.php
- Hybrid_Provider_Adapter存在于 *Hybrid/Provider_Adapter.php*
- Hybrid_Providers_Facebook存在于Hybrid/Providers/Facebook.php
- OAuthRequest(以及其他几个)存在于Hybrid/thirdparts/OAuth/OAuth.php
这就是它对我们可爱的小而和谐的自动加载器所做的:
原来的
function autoload($class)
{
$search = array('classes',
'utils',
'config');
foreach($search as $folder)
{
$file = ROOT_DIR.'/'.$folder.'/'.$class.'.php';
if(file_exists($file))
{
require_once $file;
}
}
}
混合认证之后
function autoload($class)
{
// FIXME: This is horrid.
$search = array('classes',
'utils',
'config',
'utils/hybridauth/Hybrid',
'utils/hybridauth/Hybrid/Providers',
'utils/hybridauth/Hybrid/thirdparty/Facebook',
'utils/hybridauth/Hybrid/thirdparty/LinkedIn',
'utils/hybridauth/Hybrid/thirdparty/OAuth',
'utils/hybridauth/Hybrid/thirdparty/OpenID');
// Stupid Hybrid Auth not using good file naming schemes
if (strstr($class, 'OAuth')) require_once ROOT_DIR.'/'.'utils/hybridauth/Hybrid/thirdparty/OAuth/OAuth.php';
$class = str_replace('Hybrid_', '', $class);
$class = str_replace('Providers_', '', $class);
foreach($search as $folder)
{
$file = ROOT_DIR.'/'.$folder.'/'.$class.'.php';
if(file_exists($file))
{
require_once $file;
}
}
}
算了!在不修改 HybridAuth 的源代码的情况下,我可以尝试怎样让一些东西变得更整洁?