PHP 必需或包含的文件是否需要遵循顺序


Does PHP required or included files need to follow the order?

我是PHP的新手,所以例如,如果我有一个包含2个子文件的父文件:

include_once('includes/child1.php');
include_once('includes/child2.php');

如果 child2.php有一个类 Test 的函数test_function

class Test 
{
    static function test_function() {
    }
}

那么我们可以像这样在 child1 中访问这个test_function.php吗?

public static function initialize() {
    Test::test_function()
}

如果可以,为什么它不会产生错误,因为 child1.php 包含在 child2.php 之前(注意:我是从 Javascript 的角度来的(

实际上没有调用 child1 或 child2 中的代码。你只是在定义一些类和函数,但没有任何东西调用这些函数中的任何一个。 Test::test_function()永远不会被评估,因此它不会抛出任何错误。

一般来说:是的,顺序很重要。在调用之前,需要定义您尝试调用的所有内容。在这种情况下,您不会调用任何东西,因此它无关紧要。

即,child1.php如果其代码依赖于child2,则应include(或更好:require(child2.php本身。不要把包含依赖项的负担放在child1.php的最终用户身上,这只会使事情变得非常复杂。

实际上,您应该使用自动加载,它将根据需要及时include所有必要的文件,而不必担心多个include语句的复杂性。

您可以将包含族(include_once、require、require_once(视为剪切和粘贴类型的操作。 如果你只遵循设想php创建一个大文件,粘贴每个包含调用的内容(按自上而下的执行顺序(。

所以你可能有

index.php
includes.php
functions.php

如果你在索引中这样做

include 'includes.php'
some_function();

然后包括.php

include 'functions.php'

然后在函数 php 中你有一个函数some_function(){}你可以在包含后的索引文件中使用它,php 会看到这样

include 'includes.php'
include 'functions.php'
some_function(){} 
some_function();

在上面的示例中,您将无法调用该类,因为您在包含它之前调用了它。 喜欢这个

//include_once('includes/child1.php');
Test::test_function();
//include_once('includes/child2.php');
class Test 
{
    static function test_function() {
    }
}

然而,话虽如此,我注意到您围绕调用定义了一个"方法"Test::test_function()该方法需要包装在类中才能工作,如果这是预期的方式,那么这取决于您何时实例化该类,您必须在定义Test类后执行此操作。 因此,对于这种情况,我们将假设该方法在类中

 class Test2{
      public static function initialize() {
          Test::test_function()
      }
 }

现在,如果您在父文件中或包含 child2.php 之后的任何位置使用此类,那么它将起作用,因此如果您这样做,则在父文件中。

 include_once('includes/child1.php');
 include_once('includes/child2.php');
 Test2::initialize();

你会认为这是一个像这样的大文件

 class Test2{
      public static function initialize() {
          Test::test_function()
      }
 }
 class Test 
 {
     static function test_function() {
     }
 }
Test2::initialize();

应该没问题。 在定义它之前,您不能调用它。 有意义?

综上所述,我强烈建议研究PSR自动加载机,这是当今包含类的标准方式。

这是一篇关于该主题的好帖子

http://www.sitepoint.com/autoloading-and-the-psr-0-standard/

更新说明

我会尽量让它变得简单。 PHP 的工作方式是加载文件并解析代码,这基本上意味着它只是检查语法错误或拼写错误以及任何新功能或类定义的格式(它只注册新东西的名称并检查语法(。 完成并通过后,它开始从上到下执行代码。

现在,当包含文件时,它无法立即解析它,因为它需要执行包含,而在初始解析期间它不会这样做。 运行包含后,它会解析新的代码块,然后继续从上到下执行该新代码,直到包含文件的末尾,此时它将返回到原始文件并从包含减速继续。

因此,虽然在同一个文件中定义函数之前可以运行函数,但不能在包含的文件中运行函数,这似乎是不同的,但它实际上是相同的行为。 这是因为它需要执行文件才能知道其中的函数或代码。 因此,如果您在包含之前调用该函数,PHP 甚至还没有机会查看该文件。 其中一些是因为您可以在 if 语句中放入包含,然后 PHP 就不需要包含该文件。

它不做的是,解析文件运行所有包含,然后运行代码。 我希望这能澄清流程的工作原理。