我是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视角)
答案 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就不需要包含该文件。
它不做的是,解析文件运行所有包含然后运行代码。我希望澄清流程如何运作。