10. PHP – operacje na strukturze systemu plików


Dołączanie plików

Jeżeli nasz skrypt zawiera dużo kodu możemy go podzielić na mniejsze partie, a później „sklejać” w całość. Po co? Zobaczmy.

dołączanie pliku

Wiemy już jaki jest sens dzielenia pliku, ale jak to później połączyć? ano tak:

include()

dołącza plik do kodu, w razie braku pliku generuje ostrzeżenie kontynuując pracę skryptu

include_once()

dołącza plik do kodu jednokrotnie, w razie braku pliku generuje ostrzeżenie kontynuując pracę skryptu

require()

dołącza plik do kodu, w razie braku pliku generuje błąd i przerywa działanie skryptu

require_once()

dołącza plik do kodu jednokrotnie, w razie braku pliku generuje błąd i przerywa działanie skryptu

Funkcje include_once() i require_once() są przydatne jeśli chcemy uniknąć ponownego definiowania funkcji i klas z pliku – PHP sprawdza czy dołączany plik nie był dołączony już wcześniej.

Nasze pliki wyglądają teraz tak:

header.php

<!DOCTYPE html> 
    <html> 
        <head> 
            <title>Przykład</title> 
        </head> 
        <body>

menu.php

        <div id="menu">
            <ul>
                <li>Start</li>
                <li>Kontakt</li>
            </ul>
        </div>

footer.php

        <p>to jest stopka strony</p>
    </body>
</html>

index.php

<?php 
require_once("header.php"); 
require_once("menu.php"); 
?> 

<div>I tutaj umieszczamy wszystko co chcemy na naszej stronie</div> 

<?php 
require_once("footer.php"); 
?>

PAMIĘTAJ gdzie znajdują się pliki żeby podać poprawnie ścieżkę dostępu!

ZADANIE: 

Dostosuj swoją stronę do powyższego przykładu. Podziel ją na poszczególne moduły,
a następnie za pomocą require_once() połącz ją w calość.

Funkcje operacji na strukturze systemu plików

Pełną listę funkcji znajdziecie w dokumentacji PHP – funkcje systemu katalogów, poniżej najczęściej wykorzystywane.

is_dir()

czy plik o podanej ścieżce jest katalogiem

is_file()

czy to plik

getcwd()

Wskazuje bieżący katalog roboczy

echo getcwd();   // bieżący katalog w jakim się znajdujesz np. home/php/

chdir()

Zmienia bieżący katalog roboczy (lokalizację) na podany w parametrze.

echo getcwd() . "\n";   // bieżący katalog w jakim się znajdujesz np. home/php/
chdir('public_html');   // zmiana bieżącego katalogu
echo getcwd() . "\n";   // bieżący katalog np. home/php/public_html/

scandir()

Wypisze wszystkie pliki i katalogi z określonej lokalizacji. Pierwszy parametr to lokalizacja katalogu, drugi to sortowanie: 0 (rosnąco – domyślny) lub 1(malejąco)

$dir    = '/tmp';
$files1 = scandir($dir);
$files2 = scandir($dir, 1);

print_r($files1);
print_r($files2);

otrzymamy

Array
(
    [0] => .
    [1] => ..
    [2] => bar.php
    [3] => foo.txt
    [4] => jakiśkatalog
)
Array
(
    [0] => jakiśkatalog
    [1] => foo.txt
    [2] => bar.php
    [3] => ..
    [4] => .
)

TWORZENIE I USUWANIE KATALOGU

mkdir() i rmdir()

Tworzenie katalogu:

Przykład:

<?php
if (mkdir('nowy_folder')) {
echo "Katalog został utworzony.";
}
?>

Z parametrami (np. prawa dostępu i tworzenie zagnieżdżonych katalogów):

mkdir('a/b/c', 0777, true);  // true → rekurencyjnie tworzy strukturę

Usuwanie katalogu:

Przykład:

<?php
if (rmdir('nowy_folder')) {
echo "Katalog został usunięty.";
}
?>

rmdir() działa tylko, jeśli katalog jest pusty.

Funkcje ścieżek — basename(), dirname(), pathinfo()

Służą do analizowania ścieżek bez potrzeby operowania na stringach ręcznie.

basename() — zwraca nazwę pliku

echo basename('/var/www/html/index.php'); 
// wynik: index.php

dirname() — zwraca katalog nadrzędny

echo dirname('/var/www/html/index.php'); 
// wynik: /var/www/html

pathinfo() — zwraca tablicę z częściami ścieżki

$info = pathinfo('/var/www/html/index.php');
print_r($info);

/*
Array
(
    [dirname] => /var/www/html
    [basename] => index.php
    [extension] => php
    [filename] => index
)
*/

Otwieranie katalogów — opendir(), readdir(), closedir()

Służy do przeglądania zawartości katalogów, np. listowania plików.

<?php
$dir = 'archiwum';

if ($dh = opendir($dir)) {
    echo "Zawartość katalogu $dir:<br>";
    while (($file = readdir($dh)) !== false) {
        echo "• $file<br>";
    }
    closedir($dh);
}
?>

Wynik zawiera też . (aktualny katalog) i .. (katalog nadrzędny) — można je pominąć:

if ($file != '.' && $file != '..') {
    // faktyczny plik
}

Podsumowanie

OperacjaFunkcjaUwagi
Blokowanie plikuflock()Zapobiega konfliktom przy zapisie
Kopiowaniecopy()Nadpisuje, jeśli plik istnieje
Przenoszenie / zmiana nazwyrename()Działa dla plików i katalogów
Usuwanie plikuunlink()Bez kosza
Tworzenie katalogumkdir()Obsługuje tryby i zagnieżdżenie
Usuwanie katalogurmdir()Katalog musi być pusty
Analiza ścieżekbasename(), dirname(), pathinfo()Bardzo pomocne przy pracy z uploadem
Przeglądanie katalogówopendir(), readdir(), closedir()Iteracja po plikach

Zadanie dla klas, które miały HTMLa:

Rozpocznij tworzenie autorskiego CMS – możesz wykorzystać do tego stronę www, którą posiadasz (nie WordPress, Joomla itp.).

Wydziel z niej bloki odpowiedzialne za formatowanie tych części strony, które się nie zmieniają (jak w przykładzie wyżej) tzn.:

  • nagłówek
  • menu
  • stopka
  • część główna strony
  • panele boczne
  • itp.