Search
Write a publication
Pull to refresh
0
0
Send message
Не скажу за все специальности в ИТ, но к области разработки это, врятли, отнесется. Для разработчика главное — склад ума. Любого человека можно научить писать на любом языке, но нельзя научить решать задачи.
Мне тяжело это описать словами, но попробую метафорой: «Водителей много, шоферов мало».
В первом пример вставил не тот код, вот этот код:
$lines = [];
$handle = fopen($path, "r");

while(!feof($handle)) {
    $lines[] = trim(fgets($handle));
}

fclose($handle);

Уже минусанули? Автор это вы? Разве я не прав?
Сделайте тесты, чтобы убедиться…
Прошу прощения, но что стало с хабром? Почему я начинаю все чаще видеть этот бред?
Почему теперь стало так мало дельных статей?
И почему такой шлак пропускают?
С самых первых строк начинается бред:
чтение файла строками:
— первый пример (якобы плохой):
function readTheFile($path) {
    $handle = fopen($path, "r");

    while(!feof($handle)) {
        yield trim(fgets($handle));
    }

    fclose($handle);
}

readTheFile("shakespeare.txt");

require "memory.php";

— второй:
function readTheFile($path) {
    $handle = fopen($path, "r");

    while(!feof($handle)) {
        yield trim(fgets($handle));
    }

    fclose($handle);
}

readTheFile("shakespeare.txt");

require "memory.php";

$iterator = readTheFile("shakespeare.txt");

$buffer = "";

foreach ($iterator as $iteration) {
    preg_match("/\n{3}/", $buffer, $matches);

    if (count($matches)) {
        print ".";
        $buffer = "";
    } else {
        $buffer .= $iteration . PHP_EOL;
    }
}

require "memory.php";


Ниже текст:
Хотя мы разбили документ на 1,216 кусков, мы использовали лишь 459KB памяти. Всё это, благодаря особенности генераторов — объем памяти для их работы равен размеру самой большой итерируемой части. В данном случае, самая большая часть состоит из 101,985 символов.

Какой особенности итераторов? Это тут совсем не причем?
В первом примере тупо складывают в массив:
 $lines[] = trim(fgets($handle));

Если в нем эту строку заменить на:
preg_match("/\n{3}/", trim(fgets($handle)), $matches);
if (count($matches)) {
   print ".";
}

Или во втором поставить:
$lines[] = trim(fgets($iteration));

Расход памяти будет одинаковым.
Генератор нужен для того, чтобы за раз возвращать одно значение, а не все сразу. Какая разница, если все читается из потока одинаковыми кусками?
Дальше даже читать не стал…
Прочтите — Symfony день 1. Там есть момент:
Наверное вы читали подобное предупреждение:
«Не забудьте добавить валидацию и проверки на ошибки в реальном приложении.»
или
«Безопасность отдаётся на личное изучение читателя»
или
«Конечно, Вам придётся писать тесты»

Этим и отличается хороший учебный материал от плохого.

Information

Rating
Does not participate
Registered
Activity