В системах Linux вы можете попытаться найти общие файлы на /proc.
Например, existente of / proc / vz / сообщает вам, что OpenVZ.
Вот полное руководство по обнаружению среды VM под Linux без необходимости «пить таблетки»:)
foreach ()
реализован с использованием итераторов - таким образом, он вызывает только функцию, которая возвращает массив один раз, а затем использует итератор, который указывает на существующий результат установите, чтобы продолжить работу с каждым элементом.
Я думаю, тестирование обязательно даст ответ на этот вопрос.
Вот мой код:
function GetArray() {
echo "I am called.\n";
return array("One"=>1, "Two"=>2, "Three"=>3, "Four"=>4, "Five"=>5);
}
echo "Case #1\n";
$array = GetArray();
foreach ($array as $key => $val){
// Do stuff while traversing array
echo " Inside the loop: $key => $val\n";
}
echo "\n";
echo "Case #2\n";
foreach (GetArray() as $key => $val) {
// Do stuff while traversing array
echo " Inside the loop: $key => $val\n";
}
echo "\n";
и вот результат:
Case #1 I am called. Inside the loop: One => 1 Inside the loop: Two => 2 Inside the loop: Three => 3 Inside the loop: Four => 4 Inside the loop: Five => 5 Case #2 I am called. Inside the loop: One => 1 Inside the loop: Two => 2 Inside the loop: Three => 3 Inside the loop: Four => 4 Inside the loop: Five => 5
Они оба читают функцию вызова один раз. Так что ничем не отличается.
foreach
создает копию входного массива и работает с ней на каждой итерации. Таким образом, вы можете использовать foreach (do_something_that_returns_an_array () as $ key => $ val)
, и он вызовет do_something_that_returns_an_array ()
только один раз.
Я всегда предполагал, что do_something_that_returns_an_array ()
запускается только один раз, потому что, в отличие от цикла for, нет причин для его выполнения несколько раз. Причина, по которой проверка истинности цикла for запускается в конце каждой итерации, состоит в том, чтобы учесть очень сложные средства проверки.
В качестве теста я сделал следующее:
function get_array() {echo 5; return array(1,2,3,4,5);}
foreach(get_array() as $key => $value) {}
Скрипт напечатал 5 раз. Следовательно, функция get_array ()
оценивается только один раз.
Я бы привел пример, чтобы увидеть, что происходит. Что-то вроде ...
function do_something_that_returns_an_array() {
echo 'I have been called!';
return array('i am an', 'array');
}
Как вы можете видеть на CodePad, он вызывается только один раз .
foreach () работает с объектами Iterator или IteratorAggregate (например, массивами и объектами, реализующими интерфейс). Он не может работать с неизменяемыми объектами. Функции возвращают неизменяемые объекты, поэтому возвращаемый массив должен быть скопирован в объект Iterator перед форсингом (он создается самим php)