Каков поток выполнения следующего PHP скрипта? - PullRequest
0 голосов
/ 27 мая 2020

Это два файла:

this_one. php

    <?php 

    include_once("other_one.php");

    $n1 = $_POST['name'];
    $n2 = $_POST['password'];

    echo "From this_one.php ".$n1." ".$n2."<br>";
    ?>

<form action="" method="POST">
    <input type="text" name="name">
    <input type="password" name="password">
    <button type="submit" name="Submit">Login</button>
</form>

other_one. php

<?php 
$name = $_POST['name'];
$pass = $_POST['password'];

echo "From other_one.php".$name." ".$pass."<br>";
?>

Теперь, когда я где-то читал, действие формы остается пустым, POST отправляется самому скрипту. Также other_one. php был включен в файл this_one. php

Но когда я запускаю в браузере, вывод будет:

From other_one.php hello pass
From this_one.php hello pass

Как все работает и почему этот вывод получен?

PS: Не объясняйте мне, как работает include_once. Я говорю, что для 10 процессов сценарий будет запускаться от строки 1 до конца, что, если бы я открывал соединение с базой данных во включенном файле, таким образом я бы 10 раз создавал один и тот же экземпляр $ connection, что будет накладными расходами. Каким образом можно использовать один экземпляр базы данных для всех этих 10 потоков?

1 Ответ

3 голосов
/ 27 мая 2020

Директива include вводит код в указанном файле в область видимости. Мысленно вы можете просто заменить директиву include на блок кода внутри этого файла, особой разницы нет. Зная это, ваш код будет выглядеть так:

    <?php 

    //include_once("other_one.php");
    $name = $_POST['name'];
    $pass = $_POST['password'];

    echo "From other_one.php".$name." ".$pass."<br>";

    $n1 = $_POST['name'];
    $n2 = $_POST['password'];

    echo "From this_one.php ".$n1." ".$n2."<br>";
    ?>

<form action="" method="POST">
    <input type="text" name="name">
    <input type="password" name="password">
    <button type="submit" name="Submit">Login</button>
</form>

edit

Есть четыре директивы для включения кода в область текущего процесса / запроса. Прежде чем я их назову, обратите внимание, что я сказал текущий процесс / запрос. Если 10 человек попадут на вашу страницу входа, у вас будет 10 процессов / запросов. Точно так же, если 1 человек попадет на вашу страницу входа 10 раз, у вас также будет 10 процессов / запросов. Такова сама природа PHP, и я бы не стал беспокоиться об этом, если вы на самом деле не заметите проблемы с производительностью.

Четыре директивы: include, include_once, require и require_once. Директивы, заканчивающиеся на _once, гарантируют, что предоставленный файл будет задействован в процессе только один раз. Две другие директивы позволяют включать файл несколько раз в процесс. Разница между include и require невелика, но в основном include будет генерировать игнорируемое предупреждение, если не может найти файл, тогда как require вызовет фатальную ошибку.

Обычно я лично всегда рекомендую использовать require_once для всех включений , если только не имеет явной причины вводить код несколько раз. Например, если у вас есть виджет пейджера, который должен располагаться вверху и внизу таблицы, это хорошее применение для включения одного и того же файла несколько раз. Я никогда, никогда не использую include или include_once, потому что не могу представить себе сценарий, в котором проблема с включением была бы приемлемой для меня.

Также, в качестве примечания, PHP разрешает путь к файлу потенциально неожиданным способом . Например, если вы используете include 'file.php';, то на самом деле не означает включить файл в текущий каталог. Вместо этого есть необязательный «включаемый путь», который администратор может установить (возможно, по причинам устаревшего, насколько я понимаю), и, используя этот синтаксис, сначала ищите включаемый путь. Если у вас нет пути включения или этот файл не может быть найден по этому пути, , тогда используется локальная папка. По этой причине я рекомендую всегда включать файлы, использующие «семантику пути», которая в значительной степени сводится к началу с точкой или прямым sla sh или константой, например __DIR__.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...