繁体   English   中英

__autoload vs包括家庭

[英]__autoload vs include family

我今天发现了__autoload函数,在阅读了这个函数的官方手册页后,有一点我完全没有。

使用__autoload()和让我们说require_once之间的区别是什么?

因为它看起来像自动加载是新的时尚方式来做所需的包括对我而言,使用require_once更好。 因此,__ autoload必须被定义到所有的php文件中,这意味着在那里写下它的代码,如果我把所有的 includes / require_once / ...等放到一个文件中让我们把它叫做main_header.php那么我需要做的就是在我的网络应用程序文件中写一行代码:

<?php require_once('main_header.php');  ?> 

我错了吗?

我可以看到自动加载的两件事情(不一定是__autoload ;更喜欢更现代的spl_autoload_register ):

  1. 您不需要显式包含类。 当然,你可以像你的例子一样制作一个main_header.php ,然后下一个项目生效。
  2. 如果您只使用其中的10个,则不必加载100个类。

还值得指出的是,在对尚未定义的类的对象进行反序列化时也会触发自动加载,这会使事情变得无比实用。 当然,在unserialize还有另一个钩子(配置设置为unserialize_callback_func ),因此自动加载在技术上并不是必需的。 这绝对更好。

第一:使用spl_autoload_register()而不是__autoload()

当您尝试访问不存在的类时,将调用自动加载器。 使用include()您只需要包含一个类。 主要的区别在于,使用自动加载器只包含类,如果真的需要/使用它。

通常,您在一个文件中定义自动加载器,并在每个请求中包含此自动加载器。 如果你使用bootstrapping(意思是:一个文件,捕获每个请求并将其重定向到适当的目标),它只需要在那里定义自动加载器。 所以它不需要在每个文件中定义它。

Autoloader用于延迟初始化。 它是最有效的MVC架构,而不是在这里和那里包含文件的网站,并在每个文件中定义数据库连接字符串(这很糟糕)。

将自动加载与MVC框架一起使用可以节省资源并为模块化带来很多好处。 由于您不必包含具有类的文件,因此您只需在当前所在的控制器中实例化所需的类。

基本上,这是一个OOP的事情。 如果你没有使用对象方法来构建你的网站,那么你不应该担心它包含/ require是什么对你有用。

为工作选择合适的工具。 自动加载用于在使用之前加载尚未定义的类的源代码。 因此,您可以实例化目前尚未满足文件的类。

如果您使用类并且您希望在中心位置需要文件,而不是在不同文件中使用单个点,这是有意义的。

但是,如果你正在使用包含并且需要让我们说建立一个带有菜单和页脚的网站,这没有意义。 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中注册自动加载功能的推荐方法,因为它允许有多个自动加载器。

我认为这取决于个人偏好。 对我来说,autoload是一种典型的php类型的东西 - 一种肮脏的“魔术引用” - 类似的黑客,它只存在,因为他们懒得坐下来为这个问题编写一个干净的解决方案 - 在这种情况下,足够包装系统+可捕获的ClassNotFound异常。 在我们解决这个问题之前,我会坚持要include

所有的答案都是正确和充分的。 我只是想加上我的两分钱。

首先,* _once函数很慢。 不要使用它们。

其次,在我正在开发的应用程序中,我有很多我依赖的类,我并不总是知道页面中需要哪些类。

而不是创建一个main.php页面,包括所有很多类; 显然浪费资源和时间(包含和要求是昂贵的),我使用自动加载来包含这些文件,当页面需要它们时。 因此,我所做的只是代码,并自动添加类。

这也改善了您的代码和目录结构,因为您在命名类和文件时遵循系统。

只是一个补充。 在资源使用和速度方面(要求的降序和速度的增加顺序):

Require_once(); include_once(); require(); 包括()

制作包括最好和最快。

另一个注意事项:包含和要求可能会在单元测试时变得很大。

我不知道如何防止要求/包括任何东西。 测试助手 ,可以做一些有用的事情,比如防止退出或死亡,但他们仍然无法模拟包含或要求。

Mockery建议使用自动加载来模拟公共静态方法。

Autoload和包含家庭功能都有自己的位置。

Autoload用于在基于OO的脚本(即类和接口)中延迟加载模块,并在使用new或静态调用尚未加载的类的方法时调用。 这会触发自动加载以运行尝试加载(通常通过包含)相关类或接口的函数。 这种方法的优点是类只在需要时加载。 任何未使用的类都不会被加载。

对于那些仍需要include系列的项目,Autoload不能用于加载非类或接口的程序片段。

至于必须为每个需要自动加载的脚本添加自动加载功能? 在这种情况下,您将自动加载功能放在自己的文件中,并将其包含在需要自动加载的脚本中。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM