如果我在不同的php文件中包含几个类,并将其包含到单个文件中,并且其中一些类具有对其他类的依赖关系,那么它们的包含顺序是否很重要?或者,只是简单地将它们包括在内(以任何顺序),然后才能使用所有重要的东西?在PHP中,类定义的顺序是否重要?
回答
是的,它很重要。
我建议使用autoloading来解决类依赖问题。这种方式只在实际需要时才加载,而且您不必费心手工添加每个PHP文件。
尽管如此,你必须保证每个类都在它自己的文件中。但无论如何,这是保持一切整洁干净的好方法。
那么,你是说即使我在使用它们之前包含了我需要的每个文件和依赖项,由于我包含它们的顺序,仍然可能存在问题? – TaylorOtwell 2010-08-11 13:39:15
是的,并跟踪你的所有包括是很烦人的。自动加载还可以提高性能,因为它只加载脚本实际需要的内容。加载PHP文件通常是一个I/O操作,其速度非常慢。 – selfawaresoup 2010-08-11 16:27:14
只需在他们需要之前包括他们,一切都会好起来的。
重要的是,如果一个类试图使用另一个尚未解析的类,那么就会发生错误。最好的选择是将这些类放在脚本中,这样依赖性将保持不变。
如果它们全都在同一个文件中,那么这个顺序不应该有问题。有一些罕见的例子(我已经看到命名空间)顺序很重要,但除非你推动信封,否则不要太担心。
试试吧。可能发生的最糟糕的是它会给你一个错误...
在1个PHP文件中,你可以在任何地方声明函数/类并在任何地方调用它们(在该文件中),顺序无关紧要。
至于包含,您必须在您尝试使用该文件中声明的函数/类之前包含文件。
将所有内容保存在一个文件中对于小型项目来说可能看起来很舒服,但它禁止您重复使用部分软件,并且必须始终加载全部内容,即使您并未实际使用所有类/函数。这对性能来说是相当大的浪费。 – selfawaresoup 2010-08-11 16:29:07
如果您使用的是自动装载器,则包含多个类的文件需要按层次顺序排列这些类。否则,你会有错误。 – 2015-05-10 02:55:28
是的,这很重要,当涉及大量的类时,它可能会导致问题。如果您的生产脚本需要包含40或50个班级,则使用自动加载不可行,如果您的应用程序按照最佳的面向对象操作规范进行了适当设计,并且您需要处理表格等,则始终会出现这种情况...
让我解释为什么这个命令很重要。如果您使用自动加载器,每次找到关键字扩展时,都会尝试自动加载一个类。因此,如果在扩展类被定义之前扩展,它将触发自动加载事件。
当您开发您的应用程序时,请使用自定义自动加载器。使该自定义自动加载器为您提供有关使用的时间和内存的信息。它会逐个加载所有类文件,并浪费大量时间。当您的应用程序完成后,您可以通过将许多相关类集中到一个文件中进行优化。例如,我的表单类在class.form.php中,它不只是加载表单类。它会加载另外50个与表单相关的类。因此,我将所有内容都放在一个文件中,当我创建一个新的form()时,自动加载器会加载class.form.php,其中包含表单通常需要的其他类(form_checkbox,form_input等),因此当它们需要时,它们不是自动加载器,因为它们已经被定义。
您可以创建一个PHP脚本,它将递归,解决依赖关系,并在单个类文件(class.form.php,使用我的示例)中排列所有类,以便它们都具有在extends关键字之前定义的父类这触发了自动加载)被发现。我在连接文件上运行php -w,该文件除去注释和空格。它将我的表格班从80K减少到18K。每当我使用一个表单时,我创建一个新的表单(),并且它加载了18K的值得表单相关的类,这并不过分。
最初我使用了linux命令cat,但它不起作用。您需要一个更智能的脚本,可以解析每个扩展类的父级,并在包含许多相关类的文件中正确排序类。
这似乎是你想要手动做,[OPCache](http://php.net/manual/en/intro.opcache.php)会自动执行。 – 2015-06-29 00:14:02
- 1. 变量定义中关键字的顺序是否重要?
- 2. ComponentScan顺序是否重要?
- 3. 在PHP切换语句中,事件的顺序是否重要?
- 4. CSS渐变定义的顺序是否重要?
- 5. css样式表定义的顺序是否重要?
- 6. 表中的列顺序是否重要?
- 7. 在我的HTML文件中定义jQuery原型的顺序是否重要?
- 8. Sqoop命令的顺序是否重要?
- 9. 指数的顺序是否重要?
- 10. 虚拟表的顺序是否重要?
- 11. 索引的顺序是否重要?
- 12. xmlns元素的顺序是否重要
- 13. CSS样式的顺序是否重要?
- 14. 引用jQuery的顺序是否重要?
- 15. .htaccess中的301重定向是否需要优先顺序?
- 16. SQL Server - 列顺序是否重要?
- 17. 比较列时顺序是否重要?
- 18. 在SQL搜索中,列中的数据顺序是否重要?
- 19. 选择器上的类的顺序是否重要?如果是,我可以指定顺序吗?
- 20. 列顺序是否在你的MySQL表中很重要?
- 21. 在Scala中,隐式参数的顺序是否重要?
- 22. javascript的顺序在页面中是否重要?
- 23. 在MongoDB中索引的顺序是否重要?
- 24. 在WPF中,触发器的顺序是否重要?
- 25. 在MySQL中表的顺序是否重要?
- 26. 这些值的顺序是否在JSON对象中很重要?
- 27. 在Java中,InputStream的顺序是否重要?
- 28. 目标在内核构建makefile中的顺序是否重要?
- 29. Python PIP:选项指定的顺序是否重要?
- 30. 文章类:请问加载顺序是否重要?
这是一个可以通过简单尝试就能得到最好解答的问题。 – erisco 2010-08-11 13:49:33
我确实尝试过,它*出现*能够正常工作。然而,对于PHP来说相对陌生,我想确保下面没有任何问题可能会在以后引起我的兴趣。 – TaylorOtwell 2010-08-11 14:25:06
认为最流行的PHP框架的创建者在5年前对PHP来说只是'相对较新的'...好工作@TaylorOtwell – dangel 2016-02-14 04:48:23