Autor Zpráva
lionel messi
Profil
Zdravím,

chcel by som sa poradiť s „optimalizáciou“ nasledovného kódu (nie som žiadny programátorský expert), kt. mi vkladá na určené miesta v kóde špecifikovaných súborov kód (pre ilustráciu napr. iframe):

<?php
function zapisObsah() {
    $array = array("index.php", "futbal.php"); //prípadne ďalšie súbory
    foreach ($array as $prvok) {
        $obsah = file_get_contents($prvok);
        $otvorime = fopen($prvok, "w");
        $zapis = preg_replace('~(.*<div class="telo">)(.*)~is', "\\1 <iframe></iframe>\\2", $obsah);
        fwrite($otvorime, $zapis);
        fclose($otvorime);
    }
}

?>

Zmienený kód mi funguje bezchybne, ale chcel by som sa spýtať, či je správne aj „programátorsky“ — napr. nie je zbytočné naťahovať do premennej celý obsah súboru a ako by sa to dalo obísť? Ďakujem veľmi pekne za všetky odpovede.
Joker
Profil
lionel messi:
Jestli to má dělat právě takové nahrazení, tak v tom způsobu, jakým to dělá, nevidím problém.

Možná jako takový detail by řádky 6 a 7 bylo lepší prohodit, protože fopen pro zápis smaže původní obsah souboru, takže by bylo lepší co nejvíc zkrátit dobu, po kterou ten soubor bude smazaný. Ale v tomhle případě to není podstatné (spíš by to začalo být podstatné v situaci, kdy by místo jednoho preg_replace tam byl dlouhý kód, který by mohl někde spadnout).
Alphard
Profil
Určité zjednodušení by mohla přinést funkce file_put_contents(). Jinak se to pro ekvivalentní činnost moc změnit nedá.
Z větších modifikací se nabízí otázka, jestli by nešlo měněné soubory vyčlenit do nějakého adresáře, specifikovat názvem nebo aspoň předávat v parametru, aby se nemusely vypisovat ve funkci.
lionel messi
Profil
Vďaka za postrehy, predávanie súborov v parametri ma už napadlo, ale prehodenie riadkov 6 a 7 ako píše Joker nie.
Jan Tvrdík
Profil
lionel messi:
1) Ten regulární výraz je zbytečně složitý, pokud to dobře chápu, tak by se dal použít i str_replace.
2) $array a $prvko jsou špatné názvy proměnných, lépe $soubory a $soubor. Ostatní názvy taky nejsou nic moc.
3) Obecně doporučuji pracovat všude s absolutními cestami, tedy např. $obsah = file_get_contents(__DIR__ . '/' . $soubor)
4) Nijak neřešíš atomicitu, je možné, že někdo si přečte upravovaný soubor uprostřed zápisu. Řeší se to funkcí flock.
5) Obecně to co řešíš by pravděpodobně dokázal lépe vyřešit libovolný šablonovací systém, včetně čistého PHP.


Pominu-li bod (5) a potřebu korektně ošetřovat chyby, tak bych to napsal asi takto:

$files = ['index.php', 'futbal.php'];
foreach ($files as $file) {
    $handle = fopen(__DIR__ . '/' . $file, 'r+');
    if (!$handle) return FALSE;
    if (!flock($handle, LOCK_EX)) return FALSE;
    $content = stream_get_contents($handle);
    $content = preg_replace('~<div class="telo">~i', '$0 <iframe></iframe>', $content);
    fseek($handle, 0);
    fwrite($handle, $content);
    flock($handle, LOCK_UN);
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: