我今天发现了 __ autoload 功能,在阅读了这个功能的官方手册页后,有一点我根本没找到。
使用__autoload()和让我们说require_once之间的区别是什么?
因为看起来自动加载是新的时尚方式,所以包括但对我来说,使用 require_once 会好得多。因此,必须在所有的php文件中定义__autoload,这意味着在那里编写代码,如果我将 ALL 我的includes / require_once / ...等放入一个文件中,我们将其称为 main_header .php 那么我在网络应用文件中需要做的就是写一行代码:
<?php require_once('main_header.php'); ?>
我错了吗?
答案 0 :(得分:18)
我可以看到自动加载的两件事情(不一定是__autoload
;更喜欢更现代的spl_autoload_register
:
main_header.php
,但随后下一个项目生效。还值得指出的是,在反序列化尚未定义的类的对象时也会触发自动加载,这会使事情变得无比实用。当然,unserialize
中有另一个钩子(配置设置unserialize_callback_func
),因此在技术上不需要自动加载。这绝对更好。
答案 1 :(得分:7)
首先:使用spl_autoload_register()
代替__autoload()
。
当您尝试访问不存在的类时,将调用自动加载器。使用include()
,您只需要包含一个类。主要的区别在于,使用自动加载器只包含类,如果真的需要/使用它。
通常您在一个文件中定义自动加载器,并在每个请求中包含此自动加载器。如果你使用bootstrapping(意思是:一个文件,捕获每个请求并将其重定向到适当的目标),它只需要在那里定义自动加载器。所以它不需要在每个文件中定义它。
答案 2 :(得分:5)
Autoloader用于延迟初始化。它是MVC架构中最有效的,不是在这里和那里包含文件的网站,而是在每个文件中定义数据库连接字符串(这很糟糕)。
将自动加载与MVC框架一起使用可以节省资源并为模块化带来很多好处。由于您不必包含具有类的文件,因此您只需在当前所在的控制器中实例化一个类。
基本上,这是一个OOP的事情。如果你没有使用对象方法来构建你的网站,那么你不应该担心它,include / require是适合你的。
答案 3 :(得分:2)
为工作选择合适的工具。自动加载用于在使用之前加载尚未定义的类的源代码。因此,您可以实例化目前尚未需要文件的类。
如果您使用类并且您希望在中心位置需要文件,而不是在不同文件中使用单个点,这是有意义的。
但是如果你正在使用包含并且需要让我们说建立一个带有菜单和页脚的网站,那就没有意义了。 Autoload不适用于此:
<html>
<head><title>Reciepes collection - My Homepage</title></head>
<body>
<?php include('header.html'); ?>
<h1>My Reciepes collection</h1>
<p>Cooking is one of my favorite hobbies .... (</p>....)
<?php include('footer.html'); ?>
</body>
</html>
如果您正在使用require来加载函数,则也不能使用自动加载。
因此,仅仅因为自动加载看起来有些人对你感兴趣,这并不意味着它符合您的需求。
我个人在项目中使用它,我不想处理类的需求以及我希望能够从模块化目录和库结构中动态加载类。
我只使用spl_autoload_register()
注册一个或多个自动加载实现。这是在PHP中注册自动加载功能的推荐方法,因为它允许有多个自动加载器。
答案 4 :(得分:2)
我认为这取决于个人偏好。对我来说,autoload是一种典型的php类型的东西 - 一种肮脏的“魔术引用” - 类似的黑客,它只存在,因为他们懒得坐下来为这个问题编写一个干净的解决方案 - 在这种情况下,足够包装系统+可捕获的ClassNotFound异常。在我们解决这个问题之前,我会坚持include
。
答案 5 :(得分:2)
所有答案都是正确和充分的。我只是想加上我的两分钱。
首先,* _once函数很慢。不要使用它们。
其次,在我正在开发的应用程序中,我有很多我依赖的类,我并不总是知道页面中需要哪些类。
而不是创建一个main.php页面并包含所有很多类;显然浪费资源和时间(包含和要求是昂贵的),我使用自动加载来包含这些文件,当页面需要它们时。 因此,我所做的只是代码,并自动添加类。
这也改善了您的代码和目录结构,因为您在命名类和文件时遵循系统。
只是一个补充。在资源使用和速度方面(要求的降序和速度的增加顺序):
Require_once(); include_once(); require();包括()
让包括最好和最快的。
答案 6 :(得分:0)
Autoload和include系列功能都有自己的位置。
Autoload用于在基于OO的脚本(即类和接口)中延迟加载模块,并在使用new或静态调用尚未加载的类的方法时调用。这会触发自动加载以运行尝试加载(通常通过包含)相关类或接口的函数。这种方法的优点是类只在需要时加载。任何未使用的类都不会被加载。
Autoload不能用于加载非类或接口的程序片段,对于那些仍需要include系列的项目。
至于必须为每个需要自动加载的脚本添加自动加载功能吗?在这种情况下,您将自动加载功能放在自己的文件中,并将其包含在需要自动加载的脚本中。 :)
答案 7 :(得分:0)
另一个注意事项:包含和要求可能会在单元测试时变得很大。
我不知道如何防止/包括任何事情。有test helpers,可以做一些有用的事情,比如防止退出或死亡,但他们仍然无法模拟包括或要求。
Mockery库recommends使用自动加载功能可以模拟公共静态方法。