Требуется ли PHP или включены файлы должны следовать порядку?

0

Я новичок в PHP, поэтому, например, если у меня есть родительский файл, содержащий 2 дочерних файла:

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

Если child2.php имеет класс Test с функцией test_function:

class Test 
{
    static function test_function() {

    }
}

то можно ли получить доступ к этой функции test_function в child1.php, как это?

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

и если это возможно, то почему это не создает ошибку, так как child1.php включен до child2.php (примечание: я иду с точки зрения Javascript)

Теги:

2 ответа

1
Лучший ответ

Вы можете подумать о включении семейства (include_once, require, require_once) в качестве операции вырезания и вставки. Если вы следуете за просто envision php, создавая один большой файл, вставка содержимого из каждого входящего вызова (в порядке сверху вниз).

Таким образом, у вас может быть

index.php
includes.php
functions.php

И если вы сделаете это в индексе

include 'includes.php'
some_function();

И затем в include.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 еще не успел даже посмотреть в файл. Некоторые из них связаны с тем, что вы можете включить include в оператор if, а затем PHP не нужно будет включать файл.

То, что он не делает, проанализирует файл, который запускает все входящие, а затем запускает код. Надеюсь, что выяснится, как работает процесс.

  • 0
    Спасибо за ваш ответ, один маленький вопрос: так, если он находится в том же файле, то даже если класс Test2 объявлен до класса Test, класс Test2 все еще сможет вызывать test_function () из класса Test ?
  • 0
    Да, если он находится в том же файле, как и PHP, потому что он сначала анализирует весь файл перед тем, как выполнить какой-либо код в нем, тем не менее, все же рекомендуется всегда сначала определять функции. Это также отличается от того, как он работает при включении файлов, вы должны сначала включить код, прежде чем сможете его использовать.
Показать ещё 1 комментарий
3

Нет код в ребенка1 или child2 фактически не называют. Вы просто определяете некоторые классы и функции, но ничто не вызывает какую-либо из этих функций. Test::test_function() никогда не оценивается, поэтому он не может Test::test_function() ошибки.

В общем: да, порядок имеет значение. Все, что вы пытаетесь назвать, должно быть определено до того, как вы его вызовете. В этом случае вы ничего не называете, следовательно, это не имеет значения.

Каждый файл должен заботиться о своих зависимостях. Т.е., child1.php должен include (или лучше: require) child2.php сам, если его код зависит от него. Не ставьте бремя включения зависимостей в возможного пользователя child1.php, это просто усложняет ситуацию.

Фактически, вы должны использовать автозагрузку, которая будет include все необходимые файлы как раз вовремя по мере необходимости, не беспокоясь о сложностях нескольких операторов include.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню