我有一个“简单框架”,其主要实例是$ app。 现在,实现自动加载器的最佳方法是什么(不使用Composer)。 我需要的是有一个处理所有自动加载的类(支持各种命名空间)。 我有一些方法/困境。

起初我以为我应该创建一个处理一切的“静态”类。 但后来我想到了一些事情。 如果我在实例化$ app(包含所有路径)之前使用自动加载器,我需要定义$ app之外的路径。 而且如果在自动加载类时出现错误,我将无法正确处理错误(错误处理程序在$ app中,并在之后实例化)。

然后我想到依赖注入,使自动加载器成为应用程序内的一个对象。 这将解决错误处理问题,并且不需要我硬编码路径或使它们成为全局变量。 但在我可以实例化自动加载器之前,我还必须加载许多类(包括$ app)。

但是我真的因为这个问题而陷入痛苦的世界,我真的不知道从哪里开始,是否有一些我应该考虑的建议? 你能解释一下我应该使用哪种方法以及为什么?

谢谢。

===============>>#1 票数:2

如果您编写一个框架,您应该始终查看现有框架,这些框架已经正确地解决了您的问题。 然后你会受到启发或只是使用该组件。 一个很好的起点是symfony,它们的组件是分离和测试的。 如果您使用composer加载它或手动下载它是您的选择;)

他们还有一个Classloader http://symfony.com/doc/2.0/components/class_loader.html你可以使用它。 或者你只是看看他们的方法是什么。

Autoloader(或您的类加载器)应该包含在应用程序的开头,这应该是您直接包含的唯一类。

如果你想加载你的课程动态,你必须看看你的课程如何存储,有不同的“标准”方式,如PSR0 http://www.php-fig.org/psr/psr-0/ 如果您希望用户添加自己的类,那么当他们使用您的框架时,您应该考虑支持多个标准。

===============>>#2 票数:2 已采纳

由于我在这些问题中得到的提示,我搜索了一些,并从哪里学习找到了很好的资源。

什么是自动加载?

自动加载基本上是程序找到未知类名并尝试加载它而不定义类名的过程。 如果没有自动加载器,此行为将导致致命错误(至少对于PHP)。 使用自动加载器,事情会发生变化,程序将尝试加载类名,而不知道在哪里找到它,但依赖于为此目的而考虑的函数或类,这些函数/类称为自动加载器

__autoload()vs spl_autoload_register()

在PHP中,我们有两种不同的方法来实现自动加载(您可能会发现从PHP的站点读取它很有用。)。 第一个是旧的__autoload() ,最新的是spl_autoload_register() 但究竟有什么区别? 基本上__autoload()是独一无二的,有多个自动加载器会给你带来很多麻烦,并会让你解决一个问题,这个问题可以通过使用最新的spl_autoload_ *函数轻松避免。 另一方面,spl_autoload_register()允许程序通过将它们放在一个堆栈中来拥有多个自动加载器,这样整个系统变得更加灵活,而且不那么复杂(单个Autoloader用于不同目的会导致具有很大的独特功能处理许多请求,这样你将拥有更少的代码可维护性和可重用性)。 警告:使用spl_autoload_register()将覆盖__autoload(),所以要小心。

编码标准(PHP):PSR-0与PSR-4

让我们首先说PSR-4是更新的,它被认为是对PSR-0的改进,但不是必须的,你必须使用4而不是0,正如标准(PSR-4)所述:

它完全可互操作,除了包括PSR-0在内的任何其他自动加载规范外,还可以使用它。

那我为什么要用一个而不是另一个呢?

现在这取决于你,但作为建议PSR-4解决了“嵌套”问题PSR-0,所以你应该使用前者。 假设我有一个应用程序,我的应用程序依赖于外部组件,PSR-0遵循以下语法:

\vendor\(sub_namespaces\)class_name

sub_namespaces可能不存在的位置。 但这转换为硬盘驱动器上的完全限定路径:

path/to/project/vendor/sub/namespaces/class/name.php

现在让我们假设我想在我的应用程序中包含一个名为YourLibrary的库

\YourDeveloper\YourLibrary\YourFunction

这将转化为

/path/to/project/YourDeveloper/YourLibrary/YourFunction

这就是问题,如果我想将该库放在我的子文件夹中该怎么办:

/path/to/project/vendor/vendor_name

PSR-0是绝对的,你不能只修改命名空间来控制这种行为(它会很愚蠢并且需要太多时间)所以它会转化为:

/path/to/project/vendor/YourDeveloper/src/YourDeveloper/YourLibrary/YourFunction

这不是非常嵌套和冗余吗? 好吧,使用PSR-4你可以避免这种情况并将其转化为

/path/to/project/vendor/YourDeveloper/YourLibrary/YourFunction

无需更改名称空间或自动加载器。 这基本上就是PSR-4的工作原理。 这个解释很简短,但它让你一眼就看出为什么PSR-4诞生了,为什么你应该使用它。 如果您需要更充分的解释,您可以阅读PSR-0/4规格,或者您可以在sitepoint上阅读这篇精美的文章。

我真的应该关心标准吗?

如果你已经在编程世界中呆了足够的时间,你可能最终不会问这样的问题。 但如果你是,你可能是一个新的程序员,或者你还没有成为一名程序员,这就是你应该阅读这个答案的原因。 在IT世界中,特别是在编程中,标准几乎就是一切。 如果我们没有遵循标准,我们甚至可能在我们的计算机上没有视频。 如果有人遵循他们自己的标准,一切都会看起来很乱,在这种情况下,Autoloaders会变得个性化; 所以不是拥有一个SIMPLE自动加载器,而是最终会有许多自动加载器,每个标准一个,使您的应用程序更难以维护和调试(因为每个人都可以制作错误 )。

  ask by Kei translate from so

未解决问题?本站智能推荐:

1回复

PHP自动加载类

这是我第一次使用自动加载,但我一直收到错误,说我的课程无法找到: 编辑:第52行是我使用DB类中的静态方法的地方。 出于某种原因,PHP说它无法找到DB类。 我的结构: 文件init.php包含我的自动加载器,并包含在文件ordersetup.php中,而orderset
4回复

如何自动加载PHP类?

我在Wordpress中使用类,并且尝试在我的functions.php文件中自动加载它们: 这是我的classes目录的样子: 班级/ 项目/ Application.php Core.php Sit
1回复

如何自动加载PHP 5.3类?

我正在尝试自动加载我的PHP 5.3命名空间类。 我做了 问题是有时我得到类名是User有时是KM\\User如何解决此问题?
4回复

在PHP中自动加载为“模拟”类

假设我要自动加载类,到目前为止,这很正常。 现在,假设我们处于“测试”环境中。 我想加载其他类,但这些类的行为与其他类相同,但进行了一些修改。 所以,原来 和我想要的是: 因此应该使用某种“重新命名”方法,而不是重构代码。
2回复

php类退出并自动加载

尝试检查类是否使用php的class_exits函数退出。 但是,我有__autoload并注册了一个在类不可用时回显或退出的函数。 问题是,在检查php类退出功能期间,回显if(class_exist($ class))返回false,这是不受欢迎的行为。 我该怎么做才能停止这种行为。
2回复

PHP新手-PHP类自动加载和保护

我对学习自动加载感兴趣,但是对PHP来说是新的。 我正在阅读《 PHP in Action》一书,其中写了类似autoload的方法 我想将这些方法打包在一个类中。 将它们打包在抽象类中会更好吗? 还是在普通类中并将其包含在index.php中? 我可以多有效地使用自动加
1回复

自动加载PHP App Engine来加载sdk类

使用PHP GAE时是否存在现有模块或文件来管理sdk类的自动加载? 使用google sdk类时,这可以避免需要文件。 谢谢您提供任何线索。
1回复

从PHP中的自动加载类加载扩展类

我试图找到类似的问题或情况,但没有找到。 我有以下结构: 类/ 开发/ class1.php class2.php class1.php class2.php class3.ph
1回复

动态创建类时,PHP类会自动加载?

这个简单的例子不起作用,给我: 致命错误:spl_autoload()[function.spl-autoload]:无法加载GmailServer类。 当然,这是可行的: 我想念什么吗? 编辑 :使用反射(但您必须指定完整的名称空间):
2回复

PHP自动加载器类与程序自动加载器功能?

到目前为止,我已经使用了程序独立的自动加载器函数,并使用spl_autoload_register()注册它们以自动加载我的(通常)命名空间类。 最近,我注意到人们提到将自动加载器类与一些着名的PHP框架结合使用。 我的代码几乎所有代码都是面向对象的,但在这个实例中,我并没有看到在基本函