我怎样才能让一个PHP库不需要知道其他库文件在哪里?[duplicate]

insrf1ej  于 2023-03-11  发布在  PHP
关注(0)|答案(5)|浏览(127)

此问题在此处已有答案

Best Way To Autoload Classes In PHP(8个答案)
昨天关门了。
我正在开发一个吉他和弦库。在这个库的一些文件中,我有这样的东西:

require_once "lib/GuitarChord.php";
require_once "lib/Chord.php";
require_once "lib/Key.php";
require_once "lib/Tuning.php";

如何创建此库,使其不需要知道其他库文件的位置
这样一个人就可以在任何目录中拥有库文件了吗?

wj8zmpe1

wj8zmpe11#

为这些类可能所在的所有位置创建自动加载器。
例如:

//AUTOLOADER
function class_autoloader($class) {

   // presumes classes are in './classes'
   $folders = array(
     './', './../', './../../'  
   );
   $directories = array(
     'classes','lib',  ''
   );
   $dir = dirname(__FILE__);
   $theClass = '/' . $folderedClass . '.php';

   foreach($folders as $folder){
       foreach($directories as $directory){
           $theInclude = $dir.$folder.$directory.$theClass;

           if (file_exists($theInclude) && include_once($theInclude)) {
              return TRUE;
           } 
       }
   }

  trigger_error("The class '$class' or the file '$theClass' failed to spl_autoload ", E_USER_WARNING);

  return FALSE;
}

spl_autoload_register('class_autoloader');

然后,如果您想要加载Chord类,并且您知道它在您的lib文件夹中,则自动加载器将在您执行以下操作时为您执行该工作:

new Chord();

您可以使用spl_autoload_register附加许多不同的自动加载器回调

ldfqzlk8

ldfqzlk82#

您应该检查namespacesautoloaders
假设您的所有类都在'GuitarChords'命名空间中-因此您可以创建类似于以下内容的autoload函数(假设您注册autoloader的文件位于“lib”的父目录中):

spl_autoload_register(function($class){
       $namespace = explode('\\', $class, 2);
          if ($namespace[0] === 'GuitarChords' && isset($namespace[1])) {
             include(__DIR__.DIRECTORY_SEPARATOR.'lib'.DIRECTORY_SEPARATOR.$namespace[1].'.class.php');
          }
     });

我认为最好为每个库集/命名空间注册一个autoload函数。根据系统的复杂性,遍历目录和使用include_once,file_exists等可能会产生一些讨厌的IO开销。

w7t8yxp5

w7t8yxp53#

如果你不想在一个文件中包含所有的类,你可以把文件夹名设置在某个地方,用户只需要设置一次:

$lib_folder = "lib";

require_once $lib_folder . "/GuitarChord.php";
require_once $lib_folder . "/Chord.php";
require_once $lib_folder . "/Key.php";
require_once $lib_folder . "/Tuning.php";

至于处理不同类型的数据库,您可以进行另一个设置,如$db_type,用户可以将其设置为“MYSQL”、“FILE”、“XML”等。在调用db的地方,使用switch语句查看它们正在使用什么数据库方法,并相应地更改您的调用。

**编辑:**还值得研究一下PHP's __autoload feature

mftmpeh8

mftmpeh85#

如果你的库使用了所有或大部分包含的类,那么考虑把所有与你的库相关的类放在同一个文件中。其他的解决方案只会涉及到添加更多的代码,在这种情况下,你可能应该坚持使用你当前的方法。
如果您希望出于开发目的拆分文件,那么无论如何都要继续这样做,但您仍然可以将其打包到一个文件中,以供生产使用,以便人们轻松地包括在内。

相关问题