从不同文件夹自动加载类

发布于 2024-10-21 17:30:50 字数 1019 浏览 4 评论 0原文

这就是我自动加载 controllers 文件夹中所有类的方式,

# auto load controller classes
    function __autoload($class_name) 
    {
        $filename = 'class_'.strtolower($class_name).'.php';
        $file = AP_SITE.'controllers/'.$filename;

        if (file_exists($file) == false)
        {
            return false;
        }
        include ($file);
    }

但是我在 models 文件夹中也有类,并且我也想自动加载它们 - 我该怎么办?我是否应该复制上面的自动加载并仅将路径更改为 models/ (但这不是重复的吗??)?

谢谢。

编辑:

这些是我在控制器文件夹中的类文件名:

class_controller_base.php
class_factory.php
etc

这些是我在模型文件夹中的类文件名:

class_model_page.php
class_model_parent.php
etc

这是我通常命名我的控制器类的方式(我使用下划线和小写字母),

class controller_base 
{
...
}

class controller_factory
{
...
}

这是我通常命名模型类的方式(我使用下划线和小写字母),

class model_page 
    {
    ...
    }

    class model_parent
    {
    ...
    }

This is how I autoload all the classes in my controllers folder,

# auto load controller classes
    function __autoload($class_name) 
    {
        $filename = 'class_'.strtolower($class_name).'.php';
        $file = AP_SITE.'controllers/'.$filename;

        if (file_exists($file) == false)
        {
            return false;
        }
        include ($file);
    }

But I have classes in models folder as well and I want to autoload them too - what should I do? Should I duplicate the autoload above and just change the path to models/ (but isn't this repetitive??)?

Thanks.

EDIT:

these are my classes file names in the controller folder:

class_controller_base.php
class_factory.php
etc

these are my classes file names in the model folder:

class_model_page.php
class_model_parent.php
etc

this is how I name my controller classes class usually (I use underscores and lowcaps),

class controller_base 
{
...
}

class controller_factory
{
...
}

this is how I name my model classes class usually (I use underscores and lowcaps),

class model_page 
    {
    ...
    }

    class model_parent
    {
    ...
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(12

零崎曲识 2024-10-28 17:30:50

我看到您正在使用 controller_*****model_***** 作为类命名约定。

我读了一篇很棒的 文章,建议使用 php 的命名空间 进行替代命名约定。

我喜欢这个解决方案,因为我把课程放在哪里并不重要。无论它位于我的文件结构中的哪个位置,__autoload 都会找到它。它还允许我随意称呼我的课程。我的代码不需要类命名约定即可工作。

例如,您可以设置文件夹结构,例如:

  • application/
    1. 控制器/
      • Base.php
      • 工厂.php
    2. 型号/
      • 页面.php
      • Parent.php

您的类可以像这样设置:

<?php
namespace application\controllers;
class Base {...}

并且:

<?php
namespace application\models;
class Page {...}

自动加载器可能看起来像这样(或参见最后的“自动加载注释”):

function __autoload($className) {
    $file = $className . '.php';
    if(file_exists($file)) {
        require_once $file;
    }
}

然后...您可以在中调用类三种方式:

$controller = new application\controllers\Base();
$model = new application\models\Page();

或,

<?php
use application\controllers as Controller;
use application\models as Model;

...

$controller = new Controller\Base();
$model = new Model\Page();

或,

<?php
use application\controllers\Base;
use application\models\Page;

...

$controller = new Base();
$model = new Page();

编辑 - 关于自动加载的注释:

我的主要自动加载器如下所示:

// autoload classes based on a 1:1 mapping from namespace to directory structure.
spl_autoload_register(function ($className) {

    # Usually I would just concatenate directly to $file variable below
    # this is just for easy viewing on Stack Overflow)
        $ds = DIRECTORY_SEPARATOR;
        $dir = __DIR__;

    // replace namespace separator with directory separator (prolly not required)
        $className = str_replace('\\', $ds, $className);

    // get full name of file containing the required class
        $file = "{$dir}{$ds}{$className}.php";

    // get file if it is readable
        if (is_readable($file)) require_once $file;
});

此自动加载器是类名到目录结构的直接 1:1 映射;命名空间是目录路径,类名是文件名。因此,上面定义的类 application\controllers\Base() 将加载文件 www/application/controllers/Base.php

我将自动加载器放入文件 bootstrap.php 中,该文件位于我的根目录中。这可以直接包含,也可以将 php.ini 修改为 auto_prepend_file 以便它自动包含在每个请求中。

通过使用 spl_autoload_register 您可以注册多个自动加载函数以按照您想要的方式加载类文件。即,您可以将部分或全部类放在一个目录中,或者您可以将部分或全部 同一个文件中的命名空间类。非常灵活:)

I see you are using controller_***** and model_***** as a class naming convention.

I read a fantastic article, which suggests an alternative naming convention using php's namespace.

I love this solution because it doesn't matter where I put my classes. The __autoload will find it no matter where it is in my file structure. It also allows me to call my classes whatever I want. I don't need a class naming convention for my code to work.

You can, for example, set up your folder structure like:

  • application/
    1. controllers/
      • Base.php
      • Factory.php
    2. models/
      • Page.php
      • Parent.php

Your classes can be set up like this:

<?php
namespace application\controllers;
class Base {...}

and:

<?php
namespace application\models;
class Page {...}

The autoloader could look like this (or see 'a note on autoloading' at the end):

function __autoload($className) {
    $file = $className . '.php';
    if(file_exists($file)) {
        require_once $file;
    }
}

Then... you can call classes in three ways:

$controller = new application\controllers\Base();
$model = new application\models\Page();

or,

<?php
use application\controllers as Controller;
use application\models as Model;

...

$controller = new Controller\Base();
$model = new Model\Page();

or,

<?php
use application\controllers\Base;
use application\models\Page;

...

$controller = new Base();
$model = new Page();

EDIT - a note on autoloading:

My main auto loader looks like this:

// autoload classes based on a 1:1 mapping from namespace to directory structure.
spl_autoload_register(function ($className) {

    # Usually I would just concatenate directly to $file variable below
    # this is just for easy viewing on Stack Overflow)
        $ds = DIRECTORY_SEPARATOR;
        $dir = __DIR__;

    // replace namespace separator with directory separator (prolly not required)
        $className = str_replace('\\', $ds, $className);

    // get full name of file containing the required class
        $file = "{$dir}{$ds}{$className}.php";

    // get file if it is readable
        if (is_readable($file)) require_once $file;
});

This autoloader is a direct 1:1 mapping of class name to directory structure; the namespace is the directory path and the class name is the file name. So the class application\controllers\Base() defined above would load the file www/application/controllers/Base.php.

I put the autoloader into a file, bootstrap.php, which is in my root directory. This can either be included directly, or php.ini can be modified to auto_prepend_file so that it is included automatically on every request.

By using spl_autoload_register you can register multiple autoload functions to load the class files any which way you want. Ie, you could put some or all of your classes in one directory, or you could put some or all of your namespaced classes in the one file. Very flexible :)

神爱温柔 2024-10-28 17:30:50

您应该命名您的类,以便将下划线 (_) 转换为目录分隔符 (/)。一些 PHP 框架可以做到这一点,例如 Zend 和 Kohana。

因此,您将类命名为 Model_Article 并将文件放入 classes/model/article.php 中,然后自动加载...

function __autoload($class_name) 
{
    $filename = str_replace('_', DIRECTORY_SEPARATOR, strtolower($class_name)).'.php';

    $file = AP_SITE.$filename;

    if ( ! file_exists($file))
    {
        return FALSE;
    }
    include $file;
}

另请注意,您可以使用 spl_autoload_register() 使任何函数自动加载功能。它也更灵活,允许您定义多个自动加载类型函数。

如果必须有多个自动加载函数,spl_autoload_register() 可以实现这一点。它有效地创建了一个自动加载函数队列,并按照定义的顺序运行每个函数。相比之下,__autoload() 只能定义一次。

编辑

注意: __autoload 自 PHP 7.2.0 起已弃用。强烈建议不要依赖此功能。请参阅 PHP 文档以获取更多详细信息。 http://php.net/manual/en/function.autoload.php

You should name your classes so the underscore (_) translates to the directory separator (/). A few PHP frameworks do this, such as Zend and Kohana.

So, you name your class Model_Article and place the file in classes/model/article.php and then your autoload does...

function __autoload($class_name) 
{
    $filename = str_replace('_', DIRECTORY_SEPARATOR, strtolower($class_name)).'.php';

    $file = AP_SITE.$filename;

    if ( ! file_exists($file))
    {
        return FALSE;
    }
    include $file;
}

Also note you can use spl_autoload_register() to make any function an autoloading function. It is also more flexible, allowing you to define multiple autoload type functions.

If there must be multiple autoload functions, spl_autoload_register() allows for this. It effectively creates a queue of autoload functions, and runs through each of them in the order they are defined. By contrast, __autoload() may only be defined once.

Edit

Note : __autoload has been DEPRECATED as of PHP 7.2.0. Relying on this feature is highly discouraged. Please refer to PHP documentation for more details. http://php.net/manual/en/function.autoload.php

青衫儰鉨ミ守葔 2024-10-28 17:30:50

我必须提到一些有关“良好”自动加载脚本和代码结构的内容,因此请仔细阅读以下内容


请记住:

  • 类名===文件名
  • 每个文件只有一个类

,例如:Example.php 包含

class Example {}
  • 命名空间 === 目录结构,

例如:/Path1/Path2/Example.php 匹配

namespace Path1\Path2;
class Example {}
  • 应该有一个根命名空间以避免冲突,

例如:/Path1/ Path2/Example.php 与 root:

namespace APP\Path1\Path2;
class Example {}
  • 永远不要使用手动定义的路径或目录列表,只需将加载程序指向最顶层的目录
  • 保持加载程序尽可能快(因为包含文件已经足够昂贵)

考虑到这一点,我制作了以下脚本:

function Loader( $Class ) {
    // Cut Root-Namespace
    $Class = str_replace( __NAMESPACE__.'\\', '', $Class );
    // Correct DIRECTORY_SEPARATOR
    $Class = str_replace( array( '\\', '/' ), DIRECTORY_SEPARATOR, __DIR__.DIRECTORY_SEPARATOR.$Class.'.php' );
    // Get file real path
    if( false === ( $Class = realpath( $Class ) ) ) {
        // File not found
        return false;
    } else {
        require_once( $Class );
        return true;
    }
}

放在哪里..

  • /Loader.php <-- 加载器
  • /Controller/... <-- 把你的东西放在这里
  • /Model/... <-- 或这里,等等
  • / ...

记住:

  • 如果您使用根命名空间,则加载器也必须位于该命名空间中,
  • 您可以添加 $Class 前缀来满足您的需求(controller_base {} -> class_controller_base.php),
  • 您可以将 __DIR__ 更改为包含以下内容的绝对路径:你的类文件(例如“/var/www/classes”)
  • 如果你不使用命名空间,所有文件都必须与加载程序位于同一目录中(不好!)

快乐编码;-)


对其他答案进行一些回顾:
这只是我的个人意见 - 无意冒犯!

https://stackoverflow.com/a/5280353/ 626731
@alex 很好的解决方案,但不要让你的类名为错误的文件结构付出代价;-)
这是命名空间的工作

https://stackoverflow.com/a/5280510/626731 @Mark-Eirich 它有效,但是这样做的风格非常令人讨厌/丑陋/缓慢/僵硬[..]..

https://stackoverflow.com/a /5284095/626731 @tealou 要解决他的问题,这是迄今为止最明确的方法:-) ..

https ://stackoverflow.com/a/9628060/626731 @br3nt 这反映了我的观点,但是请(!)..不要使用 strtr! ..这让我到:

https://stackoverflow.com/a/11866307/626731 @Iscariot ..给你,一点“你知道的废话基准:

Time        sprintf preg_replace strtr    str_replace v1 str_replace v2
08:00:00 AM 1.1334  2.0955       48.1423  1.2109         1.4819
08:40:00 AM 1.0436  2.0326       64.3492  1.7948         2.2337
11:30:00 AM 1.1841  2.5524       62.0114  1.5931         1.9200
02:00:00 PM 0.9783  2.4832       52.6339  1.3966         1.4845
03:00:00 PM 1.0463  2.6164       52.7829  1.1828         1.4981
Average     1.0771  2.3560       55.9839  1.4357         1.7237


Method         Times Slower (than sprintf)
preg_replace   2.19
strtr          51.97
str_replace v1 1.33
str_replace v2 1.6

来源:http:// www.simplemachines.org/community/index.php?topic=175031.0

问题?..(但事实上他关于完整路径的说法是正确的)

https://stackoverflow.com/a/12548558/626731 @Sunil-Kartikey
https://stackoverflow.com/a/17286804/626731 @jurrien

永远不要在时间紧迫的环境中循环!不要在操作系统上搜索文件! - 慢

https://stackoverflow.com/a/21221590/626731 @sagits ..比 Marks 好得多;-)

I have to mention something about "good" autoload scripts and code structure, so read the following CAREFULLY


Keep in Mind:

  • Classname === Filename
  • Only ONE class per file

e.g: Example.php contains

class Example {}
  • Namespace === Directory structure

e.g: /Path1/Path2/Example.php matches

namespace Path1\Path2;
class Example {}
  • There SHOULD be a Root-Namespace to avoid collisions

e.g: /Path1/Path2/Example.php with root:

namespace APP\Path1\Path2;
class Example {}
  • NEVER use manually defined path or directory lists, just point the loader to the top most directory
  • Keep the loader AS FAST AS POSSIBLE (because including a file is expensive enough)

With this in mind, i produced the following script:

function Loader( $Class ) {
    // Cut Root-Namespace
    $Class = str_replace( __NAMESPACE__.'\\', '', $Class );
    // Correct DIRECTORY_SEPARATOR
    $Class = str_replace( array( '\\', '/' ), DIRECTORY_SEPARATOR, __DIR__.DIRECTORY_SEPARATOR.$Class.'.php' );
    // Get file real path
    if( false === ( $Class = realpath( $Class ) ) ) {
        // File not found
        return false;
    } else {
        require_once( $Class );
        return true;
    }
}

Where to place it..

  • /Loader.php <-- there goes the loader
  • /Controller/... <-- put ur stuff here
  • /Model/... <-- or here, etc
  • /...

Remeber:

  • if you use a root namespace, the loader has to be in this namespace too
  • you may prefix $Class to match your needs (controller_base {} -> class_controller_base.php)
  • you may change __DIR__ to an absolute path containing your class files (e.g. "/var/www/classes")
  • if you don't use namespaces, all files has to be in the same directory together with the loader (bad!)

Happy coding ;-)


A little review at other answers:
THIS IS JUST MY PERSONAL OPINION - NO OFFENSE INTENDED!

https://stackoverflow.com/a/5280353/626731
@alex good solution, but don't make you class names pay for bad file structures ;-)
this is job for namespaces

https://stackoverflow.com/a/5280510/626731 @Mark-Eirich it works, but its pretty nasty/ugly/slow/stiff[..] style to do it this way..

https://stackoverflow.com/a/5284095/626731 @tealou for his problem to be solved this is the most clear approach so far :-) ..

https://stackoverflow.com/a/9628060/626731 @br3nt this reflects my point of view, but please(!) .. dont use strtr!! .. which brings me to:

https://stackoverflow.com/a/11866307/626731 @Iscariot .. to you, a little "you-know-bullshit-benchmark:

Time        sprintf preg_replace strtr    str_replace v1 str_replace v2
08:00:00 AM 1.1334  2.0955       48.1423  1.2109         1.4819
08:40:00 AM 1.0436  2.0326       64.3492  1.7948         2.2337
11:30:00 AM 1.1841  2.5524       62.0114  1.5931         1.9200
02:00:00 PM 0.9783  2.4832       52.6339  1.3966         1.4845
03:00:00 PM 1.0463  2.6164       52.7829  1.1828         1.4981
Average     1.0771  2.3560       55.9839  1.4357         1.7237


Method         Times Slower (than sprintf)
preg_replace   2.19
strtr          51.97
str_replace v1 1.33
str_replace v2 1.6

Source: http://www.simplemachines.org/community/index.php?topic=175031.0

Questions?.. (But he is in fact right about full path including)

https://stackoverflow.com/a/12548558/626731 @Sunil-Kartikey
https://stackoverflow.com/a/17286804/626731 @jurrien

NEVER loop in time critical environment! Don't search for files on os! - SLOW

https://stackoverflow.com/a/21221590/626731 @sagits .. much better than Marks ;-)

巴黎夜雨 2024-10-28 17:30:50
function autoload($className)
{
//list comma separated directory name
$directory = array('', 'classes/', 'model/', 'controller/');

//list of comma separated file format
$fileFormat = array('%s.php', '%s.class.php');

foreach ($directory as $current_dir)
{
    foreach ($fileFormat as $current_format)
    {

        $path = $current_dir.sprintf($current_format, $className);
        if (file_exists($path))
        {
            include $path;
            return ;
        }
    }
}
}
spl_autoload_register('autoload');

function autoload($className)
{
//list comma separated directory name
$directory = array('', 'classes/', 'model/', 'controller/');

//list of comma separated file format
$fileFormat = array('%s.php', '%s.class.php');

foreach ($directory as $current_dir)
{
    foreach ($fileFormat as $current_format)
    {

        $path = $current_dir.sprintf($current_format, $className);
        if (file_exists($path))
        {
            include $path;
            return ;
        }
    }
}
}
spl_autoload_register('autoload');
做个ˇ局外人 2024-10-28 17:30:50

这是我的解决方案,

/**
     * autoload classes 
     *
     *@var $directory_name
     *
     *@param string $directory_name
     *
     *@func __construct
     *@func autoload
     *
     *@return string
    */
    class autoloader
    {
        private $directory_name;

        public function __construct($directory_name)
        {
            $this->directory_name = $directory_name;
        }

        public function autoload($class_name) 
        { 
            $file_name = 'class_'.strtolower($class_name).'.php';

            $file = AP_SITE.$this->directory_name.'/'.$file_name;

            if (file_exists($file) == false)
            {
                return false;
            }
            include ($file);
        }
    }

    # nullify any existing autoloads
    spl_autoload_register(null, false);

    # instantiate the autoloader object
    $classes_1 = new autoloader('controllers');
    $classes_2 = new autoloader('models');

    # register the loader functions
    spl_autoload_register(array($classes_1, 'autoload'));
    spl_autoload_register(array($classes_2, 'autoload'));

我不确定它是否是最好的解决方案,但它似乎工作得很好......

你觉得怎么样?

Here is my solution,

/**
     * autoload classes 
     *
     *@var $directory_name
     *
     *@param string $directory_name
     *
     *@func __construct
     *@func autoload
     *
     *@return string
    */
    class autoloader
    {
        private $directory_name;

        public function __construct($directory_name)
        {
            $this->directory_name = $directory_name;
        }

        public function autoload($class_name) 
        { 
            $file_name = 'class_'.strtolower($class_name).'.php';

            $file = AP_SITE.$this->directory_name.'/'.$file_name;

            if (file_exists($file) == false)
            {
                return false;
            }
            include ($file);
        }
    }

    # nullify any existing autoloads
    spl_autoload_register(null, false);

    # instantiate the autoloader object
    $classes_1 = new autoloader('controllers');
    $classes_2 = new autoloader('models');

    # register the loader functions
    spl_autoload_register(array($classes_1, 'autoload'));
    spl_autoload_register(array($classes_2, 'autoload'));

I'm not sure whether it is the best solution or not but it seems to work perfectly...

What do you think??

药祭#氼 2024-10-28 17:30:50

我的@Mark Eirich 答案版本:

    function myload($class) {
      $controllerDir = '/controller/';
      $modelDir = '/model/';
      if (strpos($class, 'controller') !== false) {              
        $myclass = $controllerDir . $class . '.php';
      } else {
        $myclass = $modelDir . $class . '.inc.php';
      }
          if (!is_file($myclass)) return false;
          require_once ($myclass);

    }

    spl_autoload_register("myload");

在我的例子中,只有控制器类的名称中包含关键字,请根据您的需要进行调整。

My version of @Mark Eirich answer:

    function myload($class) {
      $controllerDir = '/controller/';
      $modelDir = '/model/';
      if (strpos($class, 'controller') !== false) {              
        $myclass = $controllerDir . $class . '.php';
      } else {
        $myclass = $modelDir . $class . '.inc.php';
      }
          if (!is_file($myclass)) return false;
          require_once ($myclass);

    }

    spl_autoload_register("myload");

In my case only controller class have the keyword in their name, adapt it for your needs.

狂之美人 2024-10-28 17:30:50

我可以给您最简单的答案,无需写下那些复杂的代码,甚至无需使用名称空间(如果这让您感到困惑)

示例代码。 100% 有效。

function __autoload($class_name){
$file = ABSPATH . 'app/models/' . $class_name . '.php';
if(file_exists($file)){
    include $file;
}else{
    $file = ABSPATH . 'app/views/' . $class_name . '.php';
    if(file_exists($file)){
        include $file;
    }else{
        $file = ABSPATH . 'app/controllers/' . $class_name . '.php';
        include $file;
    }
}

我想这个逻辑本身是可以解释的。干杯伙计!希望这有帮助:)

Simpliest answer I can give you without writing down those complex codes and even without using the namespace (if this confuses you)

Sample Code. Works 100%.

function __autoload($class_name){
$file = ABSPATH . 'app/models/' . $class_name . '.php';
if(file_exists($file)){
    include $file;
}else{
    $file = ABSPATH . 'app/views/' . $class_name . '.php';
    if(file_exists($file)){
        include $file;
    }else{
        $file = ABSPATH . 'app/controllers/' . $class_name . '.php';
        include $file;
    }
}

I guess the logic is explainable itself. Cheers mate! Hope this helps :)

皓月长歌 2024-10-28 17:30:50

这就是我要做的:

function __autoload($class_name) {
    $class_name = strtolower($class_name);
    $filename = 'class_'.$class_name.'.php';

    if (substr($class_name, 0, 5) === 'model') {
        $file = AP_SITE.'models/'.$filename;
    } else $file = AP_SITE.'controllers/'.$filename;

    if (!is_file($file)) return false;
    include $file;
}

只要您的文件命名一致,例如 class_controller_*.phpclass_model_*.php,这应该可以正常工作。

Here's what I'd do:

function __autoload($class_name) {
    $class_name = strtolower($class_name);
    $filename = 'class_'.$class_name.'.php';

    if (substr($class_name, 0, 5) === 'model') {
        $file = AP_SITE.'models/'.$filename;
    } else $file = AP_SITE.'controllers/'.$filename;

    if (!is_file($file)) return false;
    include $file;
}

As long you name your files consistently, like class_controller_*.php and class_model_*.php, this should work fine.

与君绝 2024-10-28 17:30:50

每个人都在处理和粘贴从互联网上获得的代码中的内容(所选答案除外)。他们都使用字符串替换。

String Replace 比 strtr 慢 4 倍。你应该用它来代替。

在包含自动加载的类时,您还应该使用完整路径,因为操作系统解析路径所需的时间更少。

Everyone is is coping and pasting things from code they got off the internet (With the exception of the selected answer). They all use String Replace.

String Replace is 4 times slower than strtr. You should use it instead.

You should also use full paths when including classes with autoloading as it takes less time for the OS to resolve the path.

残花月 2024-10-28 17:30:50

不应使用 __autoload() 函数,因为不鼓励这样做。请改用 spl_autoload()、spl_autoload_register()。 __autoload() 只能加载一个类,而 spl_autoload() 可以加载 1 个以上的类。更重要的是,将来 __autoload() 可能会被弃用。更多内容可以在 http://www.php.net/manual 上找到/en/function.spl-autoload.php

__autoload() function should not be use because it is not encourged. Use spl_autoload(), spl_autoload_register() instead. __autoload() just can load one class but spl_autoload() can get more than 1 classes. And one thing more, in future __autoload() may deprecated. More stuff can be find on http://www.php.net/manual/en/function.spl-autoload.php

一人独醉 2024-10-28 17:30:50

尽管这个脚本没有名称约定,而且这个线程已经有点旧了,以防有人正在寻找可能的答案,这就是我所做的:

function __autoload($name) {
    $dirs = array_filter(glob("*"), 'is_dir');

    foreach($dirs as $cur_dir) {
        dir_searcher($cur_dir, $name);
    }

}

function dir_searcher($cur_dir, $name) {

    if(is_file("$cur_dir/$name.php")) {
        require_once "$cur_dir/$name.php";
    }

    $dirs = array_filter(glob($cur_dir."/*"), 'is_dir');
    foreach($dirs as $cdir) {
        dir_searcher("$cdir", $name);
    }
}

不确定它是否真的是最佳的,但它通过以下方式搜索文件夹递归读取dir。通过创造性的 str_replace 函数,您可以得到您的名字约定。

Altough this script doesn't have the name convention and this thread is already a bit old, in case someone is looking of a possible answer, this is what I did:

function __autoload($name) {
    $dirs = array_filter(glob("*"), 'is_dir');

    foreach($dirs as $cur_dir) {
        dir_searcher($cur_dir, $name);
    }

}

function dir_searcher($cur_dir, $name) {

    if(is_file("$cur_dir/$name.php")) {
        require_once "$cur_dir/$name.php";
    }

    $dirs = array_filter(glob($cur_dir."/*"), 'is_dir');
    foreach($dirs as $cdir) {
        dir_searcher("$cdir", $name);
    }
}

not sure if it is really optimal, but it searches through the folders by reading dir recursively. With a creative str_replace function you can get your name cenvention.

沐歌 2024-10-28 17:30:50

我用这个。基本上将文件夹结构(MVC 等)定义为序列化数组中的常量。然后在自动加载类中调用该数组。对我来说工作效率很高。

显然,您可以使用另一个函数创建文件夹数组,但对于 MVC,您也可以手动输入它。

为此,您需要调用您的类...... class.classname.php

  //in your config file
    //define class path and class child folders
    define("classPath","classes");
    define("class_folder_array", serialize (array ("controller", "model", "view")));


  //wherever you have your autoload class
    //autoload classes
    function __autoload($class_name) {
    $class_folder_array = unserialize (class_folder_array);
    foreach ($class_folder_array AS $folder){
        if(file_exists(classPath."/".$folder.'/class.'.$class_name.'.php')){require_once classPath."/".$folder.'/class.'.$class_name.'.php';break;}
    }



    }

I use this. Basically define your folder structure (MVC etc) as a constant in a serialised array. Then call the array in your autoload class. Works efficiently for me.

You could obviously create the folder array using another function but for MVC you may as well type it in manually.

For this to work you need to call your classes ...... class.classname.php

  //in your config file
    //define class path and class child folders
    define("classPath","classes");
    define("class_folder_array", serialize (array ("controller", "model", "view")));


  //wherever you have your autoload class
    //autoload classes
    function __autoload($class_name) {
    $class_folder_array = unserialize (class_folder_array);
    foreach ($class_folder_array AS $folder){
        if(file_exists(classPath."/".$folder.'/class.'.$class_name.'.php')){require_once classPath."/".$folder.'/class.'.$class_name.'.php';break;}
    }



    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文