PHP要求或包含的文件是否需要遵循订单?

时间:2014-12-12 03:06:53

标签: javascript php

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

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

如果 child2.php 有一个测试 test_function

class Test 
{
    static function test_function() {

    }
}

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

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

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

2 个答案:

答案 0 :(得分:3)

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

总的来说:是的,订单很重要。在你打电话之前,你要调用的所有东西都需要定义。在这种情况下,你不会打电话给任何东西,因此它无关紧要。

每个文件都应该处理自己的依赖项。即,如果代码依赖于它,child1.php应include(或更好:require)child2.php本身。不要将依赖项包含在child1.php的最终用户身上,这只会让事情变得非常复杂。

事实上,您应该使用autoloading,根据需要及时include所有必需的文件,而不必担心多个include语句的复杂性。

答案 1 :(得分:1)

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

所以你可能有

index.php
includes.php
functions.php

如果你在索引

中这样做
include 'includes.php'
some_function();

然后在includes.php

include 'functions.php'

然后在函数php中你有一个函数some_function(){}你可以在include之后在索引文件中使用它,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的工作方式是加载文件并解析代码,这基本上意味着它只检查格式化语法错误​​或拼写错误以及任何新函数或类定义(它只注册新东西的名称并检查语法)。一旦完成并通过,它就开始从上到下执行代码。

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

因此,虽然看起来不同,你可以在同一个文件中定义它之前运行一个函数,但不是在一个包含的文件中,它实际上是相同的行为。这是因为它需要执行文件以了解其中的函数或代码。因此,如果您在include之前调用该函数,PHP还没有机会查看该文件。其中一些原因是因为您可以在if语句中添加一个include,然后PHP就不需要包含该文件。

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