Javascript PHP所需或包含的文件是否需要遵循顺序?
我是PHP新手,例如,如果我有一个包含两个子文件的父文件:Javascript PHP所需或包含的文件是否需要遵循顺序?,javascript,php,Javascript,Php,我是PHP新手,例如,如果我有一个包含两个子文件的父文件: include_once('includes/child1.php'); include_once('includes/child2.php'); 如果child2.php有一个类Test,其中包含一个函数Test\u函数: class Test { static function test_function() { } } 那么我们可以像这样访问child1.php中的test\u函数吗 public stat
include_once('includes/child1.php');
include_once('includes/child2.php');
如果child2.php有一个类Test,其中包含一个函数Test\u函数:
class Test
{
static function test_function() {
}
}
那么我们可以像这样访问child1.php中的test\u函数吗
public static function initialize() {
Test::test_function()
}
如果可以,为什么它不会产生错误,因为child1.php是在child2.php之前包含的(注意:我是从Javascript角度来的)您可以将include族(include_once、require、require_once)视为剪切粘贴类型的操作。如果您遵循envision php创建一个大文件,粘贴每个include调用的内容(按照自上而下的执行顺序) 所以你可能有
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();
class Test2{
public static function initialize() {
Test::test_function()
}
}
class Test
{
static function test_function() {
}
}
Test2::initialize();
在上面的示例中,您将无法调用该类,因为您是在包含它之前调用它的。像这样
//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();
你会认为这是一个像这样的大文件
include 'includes.php'
include 'functions.php'
some_function(){}
some_function();
class Test2{
public static function initialize() {
Test::test_function()
}
}
class Test
{
static function test_function() {
}
}
Test2::initialize();
应该没问题。在它被定义之前,你不能调用它。有道理吗
综上所述,我强烈建议寻找PSR自动加载器,这是目前包含类的标准方式
这是一篇关于这个话题的好文章
更新解释
我会尽量把这件事简单化。PHP的工作方式是加载一个文件并解析代码,这基本上意味着它只检查语法错误或拼写错误的格式以及任何新函数或类定义(它只注册新内容的名称并检查语法)。一旦完成并通过,它就开始从上到下执行代码
现在,当包含一个文件时,它不能立即解析它,因为它需要执行includes,而在初始解析期间它不会这样做。在运行include之后,它解析新的代码块,然后从上到下继续执行新代码,直到包含的文件结束,此时它返回到原始文件,并从include开始继续执行
因此,虽然在同一个文件中定义函数之前可以运行函数,但在包含的文件中不定义函数,这似乎有所不同,但实际上是相同的行为。这是因为它需要执行文件以了解其中的函数或代码。因此,如果在include之前调用该函数,PHP甚至还没有机会查看该文件。其中一些原因是,您可以在if语句中放入include,这样PHP就不需要包含该文件
它没有做的是,解析文件,运行所有包含项,然后运行代码。我希望这澄清了流程是如何工作的。您可以将include系列(include\u once、require、require\u once)视为剪切粘贴类型的操作。如果您遵循envision php创建一个大文件,粘贴每个include调用的内容(按照自上而下的执行顺序) 所以你可能有
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();
class Test2{
public static function initialize() {
Test::test_function()
}
}
class Test
{
static function test_function() {
}
}
Test2::initialize();
在上面的示例中,您将无法调用该类,因为您是在包含它之前调用它的。像这样
//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();
你会认为这是一个像这样的大文件
include 'includes.php'
include 'functions.php'
some_function(){}
some_function();
class Test2{
public static function initialize() {
Test::test_function()
}
}
class Test
{
static function test_function() {
}
}
Test2::initialize();
应该没问题。在它被定义之前,你不能调用它。有道理吗
综上所述,我强烈建议寻找PSR自动加载器,这是目前包含类的标准方式
这是一篇关于这个话题的好文章
更新解释
我会尽量把这件事简单化。PHP的工作方式是加载一个文件并解析代码,这基本上意味着它只检查语法错误或拼写错误的格式以及任何新函数或类定义(它只注册新内容的名称并检查语法)。一旦完成并通过,它就开始从上到下执行代码
现在,当包含一个文件时,它不能立即解析它,因为它需要执行includes,而在初始解析期间它不会这样做。在运行include之后,它解析新的代码块,然后从上到下继续执行新代码,直到包含的文件结束,此时它返回到原始文件,并从include开始继续执行
因此,虽然在同一个文件中定义函数之前可以运行函数(但不能在包含的文件中定义函数)似乎有所不同,但我