Php 有没有办法避免为非oo应用加载未使用的类?

Php 有没有办法避免为非oo应用加载未使用的类?,php,autoload,Php,Autoload,我的应用程序使用一个“中心”页面控制器,在获取请求之前,它会获取一组文件(我不太愿意说是库),每个文件都包含一些相关的类,使用require_一次。例如: require_once (dir_lib . 'db.php'); require_once (dir_lib . 'uuid.php'); require_once (dir_lib . 'data.php'); require_once (dir_lib . '

我的应用程序使用一个“中心”页面控制器,在获取请求之前,它会获取一组文件(我不太愿意说是库),每个文件都包含一些相关的类,使用require_一次。例如:

require_once (dir_lib . 'db.php');              
require_once (dir_lib . 'uuid.php');            
require_once (dir_lib . 'data.php');            
require_once (dir_lib . 'token.php');           
require_once (dir_lib . 'logs.php');            
require_once (dir_lib . 'time.php');
等等

直到最近安装了(非常棒,但是非常巨大的)“HTML净化器”库并浏览了一下它的自动加载器,我才开始检查内存使用情况。显然,autoloader并没有启用,现在每个脚本实例的内存使用量都达到了惊人的5376 KB(天哪!)。(如果这是最终结果的话,我不知道内置自动加载器是做什么的,但我离题了)如果没有HTML净化器,大多数实例的重量仍然超过1兆字节

读到关于自动加载器的文章,我得到的印象是,自动加载器完全是为OOP设计的。除了净化器库之外,我很少使用面向对象的代码。我只是误解了这个概念吗?有没有其他切实可行的方法来避免盲目地加载每个请求可能不需要的一堆类?我只是懒得把它们都放在前面

编辑-

在这里重复这个评论,以澄清我所说的非oo的意思,如果这有很大区别的话:

我是 基本上使用类来代替 不使用(几乎不使用)任何名称空间 实际的OOP。也就是说 “DBFunctions”类可能包含,例如 例如,函数“execute”和 “getRow”。这些函数被调用 使用静态方法调用,例如 “dbFunctions::execute($sql)。”


使用自动加载不应该影响性能,因为类本身在被调用或使用之前不会被加载。AutoloadConstruct基本上根据需要加载类,因为它们尚未实例化

在首先实例化类的代码中查找。除非类文件是自动实例化的,否则它不应该占用任何内存。可能不是所有的实例都已实例化,但在不需要时不会取消设置

当您找到每个实例的位置或有问题的实例时,您可以使用:

//Gets the object name using the class.
echo get_class($classinstance) , "\n";
您可以通过使用
memory\u get\u peak\u usage()
放置一些断点来处理它

现在尝试同样的方法,但这次在使用类之后使用unset():

//Output memory usage at start of class instanciation.
echo memory_get_usage()
#memory_get_peak_usage() prior to 5.2.1.

$classobject1 = new theclass();

unset($classobject1);

//Output memory usage after class instanciation.
echo memory_get_usage()
所以从理论上讲,在整个应用程序中取消设置任何未使用的实例,查找大型对象,调试

这是为了澄清@greg对OOP的评论: 以该区块为例:

class Tun{
    private $run = 'i\'m running';

    function run(){
        echo $this->run;
    }
}

echo Tun::run;
输出:

Error: Fatal error: Undefined class constant 'run' in C:\Work\pro\debug.php on line 16
上面的示例引用了一个使用OOP的函数,在本例中是类私有变量
$run
。由于该类没有实例化(对象实例),它将出错。所以,可以通过引用在类内部使用函数,但它们大多必须是简单的过程引用或常量引用


希望有帮助。

PHP5的自动加载仅用于动态加载类。应用程序中只能使用一个自动加载功能(但请参见下文)。详细信息请阅读。基本上,您可以定义一个_autoload()函数,当PHP试图调用尚未加载的类时,该函数将加载任何您想要的文件(或者执行任何您想要的操作),其中包含任何您想要的类

您在问题中提供的链接是关于标准PHP库的自动加载的,它是不同的,而且更灵活。spl_autoload_register()允许您注册一组自动加载函数,而不仅仅是一个。当您在代码中使用使用autoload的库时,这是最有用的,因为它们的autoload不必与您或其他库的库发生冲突


如果你刚开始在小项目上使用OO,你可能只想要_autoload(),但是如果你想集成像HTMLPurifier这样的库,它使用spl_autoload,google for spl_autoload for the docs,它们是第一个结果。

这些函数文件不是类有什么特别的原因吗?我唯一能想到的是PHP4兼容性,但PHP4中根本不存在自动加载

只要将那些现有的代码文件包装在
classdbfunctions{…}
中,并在函数调用前面加上
DBFunctions::
以匹配,就足以让自动加载程序开始工作(在将spl\u autoload\u register()回调设置为适合之后),这是值得的。如果您希望保持代码的这种方式,那么它仍然是一种风格上的程序化,如果您希望这样做,那么它是朝着优化整个代码库迈出的一大步


(HTML净化器是一头大象,你检查过PHP的内部函数吗?

是的,不看代码很难判断问题出在哪里。确保你的关闭过程、循环、不稳定的大型实例等等。同样,你给了我比我应得的更多的信任。我的函数按用途分类,但几乎没有任何类型的对象或实例。大部分是直接的程序代码。我主要使用类作为相关或相互依赖函数的分组方式,并使用它们的宿主文件作为将相关类分块的方式。我几乎不会称之为OOP。我错了吗?所以,是的,没有实例。直接函数调用。ie:db::execute($sql)@greg我已经在我的回答中添加了更多的信息来澄清之前关于OOP的评论。如果这澄清了任何问题,我基本上是使用类来代替名称空间,而没有使用(几乎没有)任何实际的OOP。也就是说,“DBFunctions”类可能包含函数“execute”和“getRow”。这些函数是通过静态方法调用调用的,如您所说,例如“dbFunctions::execute($sql)”,希望这是有意义的。对于你的最后一个问题——我发现PHPs过滤器和相关函数非常有限,如果不是彻底损坏的话。我确实使用我自己的正则表达式过滤器去除非ascii文本,使数据html安全,等等。然而,我需要一个真正的html净化器在所见即所得的地方。在这种情况下,自动加载应该是一个很好的适合。如果你可以通过它的默认功能,它会很快
Error: Fatal error: Undefined class constant 'run' in C:\Work\pro\debug.php on line 16