不使用自动装载直接加载功能是否正确?

时间:2017-10-29 03:52:04

标签: php

问题是自动加载多个文件包含未加载 不使用spl_autoload_register()的自动加载直接加载函数是否正确?

文件:

-class(folder)  
--cls.php (file)  
--db.cls.php(file)  
 --config.cls.php(file)  
-index.php(file)  
mp3.cls.php  

档案:cls.php

<?php
   class dosya
    {
     static function yukle($a)
     {       $d=__DIR__.DIRECTORY_SEPARATOR.str_replace('\\','/',$a).".cls.php";
        if(file_exists($d))
        {
        include_once($d);        
        }
       else{
    return self::yukle($a);

       die($a." sınıfı bulunamadı :(");
       }
     }
    }
?>

文件:mp3.cls.php

<?php
include_once("cls.php");
        dosya::yukle("config");
        dosya::yukle("db");
class mp3 extends db {}
    ?>

file:config.cls.php

<?php 
include_once("cls.php");
dosya::yukle("db");
    class config extends db {}
    ?>

file:db.cls.php

<?php include_once("cls.php");
    class db {}
    ?>

的index.php

<?php
  include_once("mp3.cls.php");
$b=new mp3();
?>

1 个答案:

答案 0 :(得分:0)

我会忽略这样一个事实,即你忽略了命名约定和自动加载器的PSR标准。但有一件事我觉得有必要指出的是:(这是你的确切代码,但其格式合理)

class dosya
{
    static function yukle($a)
    {       
        $d=__DIR__.DIRECTORY_SEPARATOR.str_replace('\\','/',$a).".cls.php";
        if(file_exists($d)){
            include_once($d);        
        }else{
            return self::yukle($a); //this is recursive, and as you dont modify $a, it's infinate

            die($a." sınıfı bulunamadı :("); //this code is never executed.
        }
    }
}

如果您说尝试加载名为foo的类。你的自动加载器会选择它,把它变成这样的东西

 $b = '/home/public_html/foo.cls.php'

这一切都很好,但是一旦你的if条件失败,因为该文件不存在if(file_exists($d)) = false。条件的else部分运行return self::yukle($a);,您可以在其中重新调用自动加载程序函数yukle($a)。现在,关键是你根本不改变$a。所以它只会重复上面的内容(分配$ b,无法检查文件)然后再次调用自身,然后再次重复。这将无限发生,或直到您的应用程序达到PHP的max_execution_time限制。

我强烈建议你不要这样做。

干杯!