tip dan trik pemrograman php buku kedua

Upload: pintamin-papin-situngkir

Post on 10-Feb-2018

265 views

Category:

Documents


1 download

TRANSCRIPT

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    1/30

    203

    File dan Direktori

    Dalam konteks penyimpanan data, file dapat dikatakansebagai tempat penyimpanan alternatif (selain database).Meskipun demikian, operasi-operasi terhadap file mutlakdiperlukan dalam pembuatan aplikasi web. Urgensi pem-bahasan ini semakin terasa karena PHP memungkinkan URLdan sumber daya jaringan lainnya diperlakukan layaknya filelokal. Sebagai tambahan, bab ini juga akan membahasoperasi-operasi direktori yang sering diperlukan.

    88

    Informasi File

    Kesuksesan operasi-operasi file sedikit banyak sangat di-pengaruhi oleh ketersediaan informasi mengenai file terkait.Dengan demikian, sudah sepantasnya jika kita memahamiinformasi-informasi penting tersebut, khususnya di bagianawal ini.

    Eksistensi FileInformasi mengenai eksistensi file merupakan senjata wajibguna mencegah kegagalan operasi selanjutnya. Dalam prak-

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    2/30

    204

    tiknya, kita memanfaatkan fungsi file_exists() yangakan mengembalikan nilai truejika file ditemukan.

    if (file_exists('test.txt')) {// Laksanakan operasi selanjutnya// ...

    }

    Nama dan Ekstensi FileMeskipun ekstensi Filesystem tidak menyediakan fungsikhusus untuk mendapatkan nama atau ekstensi file, namunterdapat sejumlah fungsi yang mencakup informasi tersebut,di antaranya pathinfo()dan basename().

    $fl = './test.txt';

    $info = pathinfo($fl);echo $info['basename']; // Output: test.txtecho $info['filename']; // Output: testecho $info['extension']; // Output: txt

    echo basename($fl); // Output: test.txtecho basename($fl, '.txt'); // Output: test

    Baik pathinfo()maupun basename()juga dapat diguna-kan pada URL.

    $url = 'http://www.test.com/test.php';print_r(pathinfo($url));echo basename($url);

    Pemisah PathApabila Anda ingin menetapkan pemisah path yang portable,gunakan slash (/) karena karakter ini dapat bekerja baik dilingkungan Windows maupun Unix/Linux.

    var_dump(file_exists('C:/tmp/test.txt'));var_dump(file_exists('/tmp/test.txt'));

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    3/30

    205

    Meskipun ekstensi Directory juga menyediakan kons-tanta DIRECTORY_SEPARATOR , namun lebih efisien jikakita menggunakan karakter slash.

    89

    Properti File

    Ketersediaan fungsi yang cukup lengkap di ekstensiFilesystem memungkinkan kita untuk mengungkap infor-masi detail pada suatu file. Lebih jelasnya, di sini kita akanmemanfaatkan fungsi-fungsi yang ada sesuai kebutuhan.

    Properti StandarLayaknya explorer file, kita dapat menyajikan informasispesifik mengenai properti file, seperti tipe, lokasi, ukuran,dan waktu pembuatan serta modifikasi.

    $fl = './test.txt';

    // Mendapatkan tipe fileecho filetype($fl), '
    ';// Mendapatkan path absolutecho realpath($fl), '
    ';// Mendapatkan ukuran (dalam satuan byte)echo filesize($fl), ' byte
    ';// Modifikasi terakhir$mtm = filemtime($fl);echo date('d F Y H:i:s', $mtm), '
    ';// Akses terakhir$atm = fileatime($fl);echo date('d F Y H:i:s', $atm), '
    ';

    Format Ukuran FileInformasi mengenai ukuran file yang dikembalikan dalamsatuan byte acap kali menyulitkan kita menginterpretasikanukuran seharusnya. Adapun langkah bijak untuk mengatasi

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    4/30

    206

    persoalan ini dengan mengonversi ukuran ke satuan terdekat,misalnya KB, MB, atau GB.

    public static function getSize($fl) {// Array satuan$arr = array('B','KB','MB','GB','TB','PB');$size = filesize($fl);$cnt = 0;while ($size >= 1024) {$cnt++;$size /= 1024;

    }return number_format($size,($cnt ? 2 : 0), ',', '.') . ' '.$arr[$cnt];

    }

    Atribut FileUntuk mendapatkan informasi mengenai atribut file, guna-kan fungsi-fungsi berawalan is_, seperti is_executable(),is_readable(), dan is_writable().

    $fl = './test.txt';

    var_dump(is_readable($fl));

    var_dump(is_writable($fl));var_dump(is_executable($fl));

    Mengubah Atribut FileMelalui fungsi chmod(), ekstensi Filesystem mengizinkanAnda untuk mengubah atribut-atribut (mode) file. Dalampengubahan ini, sebaiknya gunakan format bilangan berbasis8 (oktal) pada argumen mode untuk menghindari kegagalanoperasi.

    // Read write untuk owner, read untuk user lainvar_dump(chmod($fl, 0644));

    var_dump(is_writable($fl));

    // Output: true

    var_dump(is_executable($fl));// Output: false

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    5/30

    207

    90

    Operasi File

    Sehubungan dengan fungsionalitas utamanya, ada beberapaoperasi file yang disediakan oleh ekstensi Filesystem. Operasi-

    operasi yang lazim dilakukan meliputi pembuatan, pengha-pusan, penulisan, dan pembacaan.

    Penulisan FileUntuk melakukan penulisan string ke file secara praktis,Anda dapat memanfaatkan fungsi file_put_contents().Fungsi yang diperkenalkan sejak PHP 5 ini akan melakukantiga pekerjaan sekaligus, yakni membuka, menulis, dan me-nutup file.

    $str = 'Dirgahayu RI Ke-63';$fl = './test.txt';

    $write = file_put_contents($fl, $str);

    if ($write) {echo 'Berhasil, ', $write, ' byte tersimpan';

    }

    Bagi Anda yang masih menggunakan PHP versi 5 ke bawah,pilihan Anda adalah fungsi fwrite() atau aliasnya,fputs(). Adapun jika diperlukan, sebenarnya tidak sulituntuk mendefinisikan method yang memiliki perilaku sepertifile_put_contents().

    /* Replikasi file_put_contents */function file_put_contents($fl, $data,$append = false) {$mode = $append ? 'a' : 'w';

    $fp = fopen($fl, $mode);

    if ($fp === false) {return 0;

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    6/30

    208

    } else {if (is_array($data)) {$data = implode($data);

    }$byte = fwrite($fp, $data);fclose($fp);return $byte;

    }

    }

    // Contoh penggunaan$str = 'Dirgahayu RI ke-63';

    // Replacevar_dump(file_put_contents('test.txt', $str));

    // Appendvar_dump(file_put_contents('test2.txt', $str,true));

    Membaca Isi FileTersedianya beragam fungsi pembacaan file menuntut kitauntuk memahami strategi penggunaannya. Dengan kata lain,

    seyogyanya kita memilih fungsi yang tepat sesuai kebutuhan.Apabila Anda ingin membaca seluruh isi file secara praktisgunakan fungsi file_get_contents(). Tidak sepertifile_put_contents()fungsi ini sudah tersedia sejak PHP4.

    $fl = './test.txt';echo file_get_contents($fl);

    Pembacaan praktis seluruh file juga dapat dilakukan denganmemanfaatkan fungsi file(). Fungsi ini identik denganfile_get_contents(), kecuali nilai kembaliannya adalahsuatu array. Untuk alasan performansi, sebaiknya hindaripenggunaan fungsi file()ini apabila data yang akan diam-bil cukup besar.

    print_r(file($fl));

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    7/30

    209

    Sebagai alternatif, jika Anda ingin membaca file per baris,gunakan fungsi fgets(). Sementara itu, apabila Anda hanyaingin membaca karakter tunggal, tersedia fungsi fgetc().Berbeda dengan pendekatan-pendekatan sebelumnya, keduafungsi ini memerlukan pointer file.

    $fp = fopen($fl, 'r') ordie('Gagal membuka file');

    if ($fp) {while (!feof($fp)) {$buffer = fgets($fp, 4096);echo $buffer;

    }fclose($fp);

    }

    Sebagai tambahan, jika Anda ingin melakukan pembacaansekaligus pemformatan, gunakan fungsi fscanf().

    Usahakan untuk sesegera mungkin menutup file apabila

    sudah tidak diperlukan. Langkah ini sangat pentinguntuk menghemat penggunaan sumber daya.

    91

    Highlight Sintaks

    Untuk menghasilkan visualisasi kode dengan dukungansyntax highlighting, Anda cukup menyimpan file programdengan ekstensi .phps. Langkah ini mengambil asumsi bahwaserver Anda mendukung fitur highlighting dan mengaktifkanbaris berikut:

    AddType application/x-httpd-php-source .phps

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    8/30

    210

    Apabila Anda ingin mengimplementasikan syntaxhighlighting secara independen (tanpa bergantung padadukungan server), Anda bisa memanfaatkan fungsihighlight_string() atau highlight_file(). Keduafungsi ini berbeda dalam hal penerimaan jenis argumen,yaitu string dan file.

    $kode =

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    9/30

    211

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    10/30

    212

    92

    Include/Require File

    Mengacu pada struktur aplikasi web, yang lazimnya terdiriatas beberapa file, tidak mungkin kita dapat menghasilkan

    aplikasi tanpa meng-include file lain. Sehubungan dengan halini, akan dijelaskan mengenai tip dan trik seputar include/require file.

    Menspesifikasikan FileFile-file yang dimaksudkan untuk di-include, atau tidakdijalankan secara langsung, sebaiknya disimpan denganekstensi khusus, misalnya inc atau inc.php. Umumnya jenisekstensi kedua lebih disukai, meskipun Anda sudah mem-proteksi file-file inc.

    Untuk mencegah kegagalan include yang diakibatkan tidakditemukannya file, kita bisa memeriksa eksistensi file terlebih

    dahulu.function include_eksis($fl) {if (file_exists($fl)) {include $fl;

    } else {// Misal keluar dari programexit('File ' . $fl . ' tidak ditemukan');

    }}

    include_eksis('nothing.php');

    Sebagai catatan, apabila opsi allow_url_fopen diaktifkan,kita diperbolehkan untuk meng-include URL.

    include 'http://www.test.com/test.inc';

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    11/30

    213

    Mencegah Include/Require UlangUntuk mencegah include/require ulang, gunakan fungsiinclude_once()atau require_once(). Kedua fungsi inimemastikan bahwa file yang sama hanya akan di-includesekali.

    require 'test2.php';

    // Ini tidak dievaluasi lagirequire_once 'test2.php';

    Apabila Anda ingin mendapatkan nama-nama file yangsudah di-include atau di-require, gunakan fungsiget_included_files() atau get_required_files(),yang merupakan aliasnya. Fungsi ini akan mengembalikanarray nama file, yang direpresentasikan sebagai path absolut.

    include 'test.php';require 'test2.php';require_once 'test2.php';

    echo '';print_r(get_included_files());

    Include vs RequirePerbedaan mendasar antara include dan require terletak padareaksi yang ditimbulkan manakala file tidak ditemukan. Padapendekatan include, parser akan menampilkan pesanwarning dan mencoba melanjutkan eksekusi. Sementara itu,pada require akan menimbulkan pesan fatal error daneksekusi program segera dihentikan.

    include 'nothing1.php';echo 'Ini masih dieksekusi';

    require 'nothing2.php';echo 'Ini sudah tidak dieksekusi';

    Mengacu pada perilaku masing-masing, kita bisa memilihpendekatan yang tepat sesuai kebutuhan. Singkatnya, guna-

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    12/30

    214

    kan require jika ingin agar eksekusi tidak dilanjutkan, dansebaliknya manfaatkan include.

    93

    File Konfigurasi

    Menyimpan konfigurasi-konfigurasi aplikasi di sebuah filemerupakan suatu langkah praktis, khususnya jika kita tidakmemiliki DBMS. File yang digunakan untuk penyimpananini juga variatif, namun umumnya adalah file-file berekstensiini atau php.

    Apabila Anda menggunakan file ini, Anda bisa meman-faatkan fungsi parse_ini_file() untuk mengelola file.Fungsi ini memungkinkan kita untuk menguraikan file .inidengan mudah. Sebagai contoh, kita memiliki file test.iniseperti berikut:

    ; Contoh file .ini

    [Seksi_1]satu = 1; Ini komentar, tidak diprosesdua = 5

    [Seksi_2]tiga = "tiga"empat = "empat"

    Pada saat ingin menguraikan file .ini, Anda bisa mengikutkanbagian seksi atau mengabaikannya. Langkah ini dilakukandengan cara menambahkan argumen opsional boolean trueatau mengosongkannya.

    $fl = 'test.ini';

    // Mengabaikan seksi (membentuk array asosiatif)$ini1 = parse_ini_file($fl);

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    13/30

    215

    // Mengakses elemen tigaecho $ini1['tiga']; // Output: tigaprint_r($ini1);/* OutputArray(

    [satu] => 1[dua] => 5[tiga] => tiga[empat] => empat

    )*/

    // Ikutkan seksi (membentuk array multidimensi)$ini2 = parse_ini_file($fl, true);print_r($ini2);/* Output:Array(

    [Seksi_1] => Array(

    [satu] => 1[dua] => 5

    )

    [Seksi_2] => Array

    ([tiga] => tiga[empat] => empat

    ))*/

    Perlu diperhatkan, penulisan nilai (value) string dilakukanmenggunakan tanda kutip ganda. Adapun penggunaan tandakutip tunggal mengakibatkan hasil pengaksesan (keluaran)juga mengandung tanda kutip tunggal.

    Khusus untuk file konfigurasi php, kita cukup memerlukanoperasi penulisan saja karena pembacaan dapat dilakukanlayaknya mengakses variabel. Penyimpanan konfigurasi di file

    php cenderung lebih aman dibanding file ini. Hal ini karenafile diperlakukan sebagai kode program. Artinya, selama filetidak men-generate output, browser tidak akan mencetak

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    14/30

    216

    informasi apa pun ketika mencoba mengakses file konfi-gurasi.

    94

    Informasi Direktori

    Untuk mendapatkan informasi-informasi direktori, kita bisamemanfaatkan fungsi-fungsi Filesystem. Selain itu, PHP jugamenyediakan ekstensi Directory yang khusus didesain untukmenangani direktori.

    Eksistensi DirektoriFungsi file_exists()tak hanya dimaksudkan untuk me-meriksa eksistensi file, namun juga mencakup direktori.Sementara itu, untuk memastikan bahwa objek benar-benarmerupakan direktori, gunakan fungsi is_dir().

    var_dump(file_exists('./dir'));

    // Memeriksa eksistensi subdirektorivar_dump(file_exists('./dir/subdir'));

    // Memastikan bahwa benar-benar direktorivar_dump(is_dir('./dir'));var_dump(is_dir('./dir/subdir'));

    Nama dan PathUntuk mendukung operasi-operasi direktori, terkadang kitamemerlukan informasi mengenai nama dan path direktoriterkait. Langkah ini bisa kita wujudkan dengan meman-faatkan fungsionalitas dirname()dan realpath().

    $dir = 'dir/subdir';

    // Mengembalikan nama direktoriecho dirname($dir);

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    15/30

    217

    // Mengembalikan path absolutecho realpath($dir);

    Sementara itu, jika Anda ingin mendapatkan nama pathcurrent direktori, Anda bisa memanfaatkan fungsigetcwd().

    echo getcwd();

    Properti DirektoriLayaknya bekerja dengan file, kita bisa memanfaatkan fungsi-fungsi berawalan is_ untuk mendapatkan informasimengenai properti direktori.

    $dir = 'dir/subdir';

    var_dump(is_readable($dir));var_dump(is_writeable($dir));

    95

    Traversal File

    Berbekal fungsi-fungsi yang telah tersedia, Anda tidak akankesulitan melakukan operasi ini. Namun bagaimana imple-mentasinya secara nyata? Bagaimana pula mengimplemen-tasikan traversal pada direktori dan subdirektori?

    Bagi pengguna PHP 5 ke atas, Anda dapat memanfaatkanfungsi scandir() untuk memindai file-file di suatu direk-tori. Di samping mendapatkan nama-nama file dan direktori,fungsi ini juga mengembalikan metaentry . (currentdirektori) dan .. (direktori induk). Oleh karena itu, jika

    Anda hanya ingin mengambil nama-nama file, gunakanfungsi is_file()untuk menyaring entry.

    class Traversal {

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    16/30

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    17/30

    219

    while (false !== ($fl = $d->read())) {$path = $dir . '/' . $fl;// Hanya mengambil fileif (is_file($path)) {$arr[] = $fl;

    }}

    $d->close();return $arr;

    }

    Khusus untuk traversal yang mencakup seluruh subdirektori,kita bisa menggunakan pendekatan rekursif.

    public static function listFileRec($dir) {$arr = array();if (is_dir($dir)) {$fls = scandir($dir);foreach ($fls as $fl) {// Abaikan metaentryif ($fl != '.' && $fl != '..') {$path = $dir . '/' . $fl;// Jika direktori, panggil method ini// secara rekursif guna mencari// di subdirektoriif (is_dir($path)) {

    $arr = array_merge($arr,Traversal::listFileRec($path));

    } else {$arr[] = $path;

    }}

    }return $arr;

    } else {return false;

    }}

    Penggunaan array_merge() di atas mengakibatkan hasilyang dikembalikan berupa array indexed. Jika Anda meng-

    abaikan array_merge(), Anda akan mendapatkan hasilberupa array multidimensi.

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    18/30

    220

    96

    Pencarian dan Penyaringan File

    Untuk melakukan pencarian dan penyaringan file, PHPmenyediakan pendekatan yang variatif. Bagian ini akan

    mengulas beberapa pendekatan yang nantinya mungkin bisaAnda adopsi atau kembangkan lebih lanjut.

    Salah satu pendekatan yang praktis adalah dengan meman-faatkan fungsi glob(). Fungsi ini menerima argumenberupa pola, dan akan mengembalikan array berisi file/direktori yang sesuai.

    // Mencari file berekstensi .php$list = glob('*.php');

    foreach ($list as $fl) {echo $fl, '
    ';

    }

    Fungsiglob()

    normalnya hanya melakukan pencarian dicurrent direktori sehingga kita perlu mengubah lokasidirektori ketika ingin bekerja dengan direktori lain.

    // Mencari file .txt di direktori /tmp$d = '/tmp/*.txt';// Mengubah direktori aktifchdir(dirname($d));

    $list = glob(basename($d));foreach ($list as $fl) {

    echo $fl, '
    ';}

    Pendekatan lain yang dapat kita gunakan adalah denganmemanfaatkan method pengambilan file sebelumnya. Untuk

    tujuan pencarian ini, kita tinggal menambahkan fungsiona-litas pencarian, misalnya menggunakan fungsi stripos().

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    19/30

    221

    class Pencarian {

    public static function find($key, $dir) {$arr = array();

    if (is_dir($dir)) {$fls = scandir($dir);foreach ($fls as $fl) {// Abaikan metaentryif ($fl != '.' && $fl != '..') {

    $path = $dir . '/' . $fl;// Jika direktori, cari secara rekursifif (is_dir($path)) {$arr = array_merge($arr,Pencarian::find($key, $path));

    } else {// Jika sesuai, simpan ke arrayif ((stripos($fl, $key)) !== false) {$arr[] = $path;

    }}

    }}

    return $arr;} else {

    return false;}

    }

    }

    echo '';// Mencari file testprint_r(Pencarian::find('test', '/tmp'));

    // Menyaring file berekstensi .txtprint_r(Pencarian::find('.txt', '/tmp'));

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    20/30

    222

    Gambar 8.2 Pencarian dan penyaringan file

    97

    Operasi Direktori

    Sebagaimana diketahui, operasi-operasi direktori yang utamameliputi pembuatan dan penghapusan. Secara umum,operasi-operasi ini dapat kita lakukan dengan mudah melaluifungsi-fungsi yang tersedia.

    Untuk menciptakan direktori baru, PHP menyediakan fungsibuilt-in mkdir().

    $dir = './test';if (!is_dir($dir)) {// Buat direktori barumkdir($dir);

    }

    Sekadar catatan, mkdir() hanya dapat menciptakan direk-tori baru apabila induk direktorinya eksis. Jika Anda inginmenciptakan subdirektori sekaligus induk direktorinya, Anda

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    21/30

    223

    bisa memanfaatkan program mkdir sistem. Dalam imple-mentasinya, gunakan fungsi exec()atau system() untukmenjalankan program tersebut.

    // Untuk lingkungan Unix/Linuxpublic static function mkdirNix($dir) {if (!is_dir($dir)) {$dir = escapeshellarg($dir);exec('/bin/mkdir -p ' . $dir);

    return true;} else {return false;

    }}

    // Untuk lingkungan Windowspublic static function mkdirWin($dir) {if (!is_dir($dir)) {$dir = escapeshellarg($dir);exec('mkdir ' . $dir);return true;

    } else {return false;

    }}

    Selain operasi-operasi umum, mungkin kita juga akan me-nemui operasi khusus, seperti penghapusan direktori yangtidak kosong. Bagaimanapun juga, fungsi rmdir() tidakdapat digunakan untuk menghapus direktori dan isinya.Adapun sebagai solusi, kita mengadopsi pendekatan del tree.Tekniknya, hapus dari akar kemudian baru menghapusinduk direktori.

    public static function deltree($dir) {if (is_dir($dir)) {$dirs = scandir($dir);foreach ($dirs as $fl) {if ($fl != '.' && $fl != '..') {$path = $dir . '/' . $fl;

    // Panggil secara rekursifif (is_dir($path)) {Direktori::deltree($path);

    } elseif (is_file($path)) {

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    22/30

    224

    // Hapus fileunlink ($path);

    }}

    }return rmdir($dir);

    } else {return false;

    }}

    Sebagai alternatif, penghapusan direktori tak kosong dapatdilakukan dengan memanfaatkan program sistem. Sepertikasus sebelumnya, di sini kita menggunakan fungsi exec()untuk menjalankan program eksternal.

    // Untuk lingkungan Unix/Linuxpublic static function delNix($dir) {if (is_dir($dir)) {$dir = escapeshellarg($dir);exec('rm -rf ' . $dir);return true;

    } else {return false;

    }

    }

    // Untuk lingkungan Windowspublic static function delWin($dir) {if (is_dir($dir)) {$dir = escapeshellarg($dir);exec('rmdir /s /q ' . $dir);return true;

    } else {return false;

    }}

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    23/30

    225

    98

    Iterator Direktori

    Jika di bab awal kita telah mengulas SPL, kali ini akan di-jelaskan implementasinya terkait dengan operasi direktori.

    Setidaknya ada dua kelas khusus yang dapat kita manfaatkanuntuk bekerja dengan direktori, yakni DirectoryIteratordan RecursiveDirectoryIterator.

    Melalui objek DirectoryIterator, kita dapat memindaientry di dalam direktori secara praktis. Dalam pengguna-annya, isikan path direktori sebagai argumen konstruktorkelas ini.

    $dir = '/tmp';try {// Menciptakan objek iterator direktori$di = new DirectoryIterator($dir);

    foreach ($di as $fl) {

    if (is_file($dir . '/' . $fl)) {echo $fl, '
    ';}

    }

    } catch(Exception $e) {echo 'File tidak ditemukan..';

    }

    Seperti halnya pendekatan rekursif yang kita gunakan, SPLjuga menyediakan kelas untuk pemindaian seluruh file didirektori dan sub-sub direktori.

    $dir = '/tmp';

    try {

    // Menciptakan objek iterator rekursif$rdi = new RecursiveDirectoryIterator($dir);$rii = new RecursiveIteratorIterator($rdi);

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    24/30

    226

    // Cetak semua file beserta path-nyaforeach ($rii as $fl) {echo $fl, '
    ';

    }

    } catch(Exception $e) {echo 'File tidak ditemukan..';

    }

    99

    Operasi File dengan PEAR

    Bagian ini secara khusus akan menjelaskan operasi-operasifile dengan memanfaatkan paket PEAR. Sebenarnya adabeberapa paket yang terkait dengan operasi file, namun disini kita memfokuskan pada fungsionalitas paket File danFile_Find.

    Paket FilePaket ini memungkinkan kita melakukan operasi-operasistandar pada file dan direktori dengan mudah. Secara umum,fungsionalitas ekstensi Filesystem terangkum di dalam paketFile.

    require_once 'File.php';

    $fl = './test.txt';

    $e = File::write($fl, 'Halo Indonesia',FILE_MODE_WRITE);if (PEAR::isError($e)) {echo 'Error: ' . $e->getMessage();

    } else {

    // Membaca isi file

    echo File::readAll($fl);}

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    25/30

    227

    Paket File_FindPaket ini memungkinkan kita melakukan pencarian filedengan pola yang variatif. Bagi Anda yang terbiasa meng-gunakan explorer file, Anda bisa memanfaatkan jenis polashell.

    require_once 'File/Find.php';

    $dir = '/tmp';

    // Pola untuk semua file, kecuali// yang berekstensi .html$pola = '*.*|*.html';

    // Pencarian dengan jenis pola shell$fl = &File_Find::search($pola, $dir, 'shell');

    echo '';print_r($fl);

    Jenis pola lainnya yang tersedia adalah php (mengacu standarPOSIX) dan perl (mengacu standar PCRE).

    // Pola untuk semua file berekstensi .txt

    $pola = '/\.txt$/i';

    // Pencarian dengan jenis pola perl$fl = &File_Find::search($pola, $dir, 'perl');

    echo '';print_r($fl);

    Paket File_SearchReplacePaket ini sangat berguna ketika Anda ingin me-replace teks disatu atau lebih file. Kelebihan lain dari paket ini adalahmampu menangani semua file di direktori dan mengabaikanbaris teks tertentu.

    Require_once 'File/SearchReplace.php' ;

    // File target$files = array( 'test1.txt',

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    26/30

    228

    'test2.txt','test3.txt'

    );

    $dir = './';

    // Teks yang dicari$find = 'Jaya';// Teks pengganti$repl = 'Merdeka';

    // Mencakup subdirektori$sub = true;// Abaikan baris dengan karakter awal sbb$ignoreline = array("#", ":");

    // Menciptakan objek$sr = new File_SearchReplace($find, $repl,$files, $dir, $sub, $ignoreline) ;

    // Start search dan replace$sr -> doSearch() ;

    100

    Upload File

    Di PEAR, kita bisa memanfaatkan paket HTTP_Uploaduntuk mengirim file dengan mudah dan aman. Fitur yangdisediakan paket ini tergolong cukup lengkap, meliputi me-kanisme validasi, informasi upload, dan penanganan bebe-rapa file sekaligus. Berikut contoh sederhana penggunaanHTTP_Upload.

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    27/30

    229

    if (isset($_POST['submit'])) {require_once 'HTTP/Upload.php';// Lokasi upload$dir = 'upload';

    $hu = new HTTP_Upload("en");// Mendapatkan file$fl = $hu->getFiles('fl');

    if ($fl->isValid()) {

    // Upload file$moved = $fl->moveTo($dir);if (!PEAR::isError($moved)) {

    echo 'Upload berhasil';echo '';// Debug (print info)print_r($fl->getProp());

    } else {echo $moved->getMessage();

    }} elseif ($fl->isMissing()) {echo 'File Kosong';

    } elseif ($fl->isError()) {echo $file->errorMsg();

    }

    }

    Untuk kasus upload beberapa file, kita tidak perlu mene-tapkan argumen pada method getFiles(). Akibatnya,method ini akan mengembalikan hasil berupa array file.

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    28/30

    230

    $hu = new HTTP_Upload('en');// Mendapatkan array file$fls = $hu->getFiles();

    foreach($fls as $fl){if (PEAR::isError($fl)) {echo $fl->getMessage();

    }

    if ($fl->isValid()) {$moved = $fl->moveTo($dir);if (PEAR::isError($moved)) {echo $moved->getMessage();

    }$real = $fl->getProp('real');echo 'File ' . $real .' berhasil diupload', '
    ';

    } elseif ($fl->isMissing()) {echo 'File Kosong', '
    ';

    } elseif ($fl->isError()) {echo $fl->errorMsg();

    }}

    }

    101

    Kompres/Dekompres File

    PHP tidak hanya mampu digunakan untuk mendukungoperasi-operasi file standar, tetapi juga memungkinkanmelakukan operasi spesifik, seperti kompres/dekompres file.Untuk melakukan operasi ini, Anda bisa memilih pendekatanekstensi built-in, PEAR, atau menulis program sendiri.

    Di bagian ini, kita memilih langkah yang paling praktis, yaknimemanfaatkan ekstensi Zip File. Sebelumnya, pastikanbahwa Anda sudah mengaktifkan ekstensi karena normalnya

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    29/30

    231

    belum aktif. Berikut contoh penggunaan ekstensi Zip Fileyang direpresentasikan melalui objek ZipArchive.

    $zip = new ZipArchive();$fl = './test.zip';

    // Menciptakan file zipif ($zip->open($fl, ZIPARCHIVE::CREATE) === true){$dir = './dir';// Menambahkan file ke file zip$zip->addFile($dir . '/elex.gif');$zip->addFile($dir . '/test.doc');$zip->addFile($dir . '/test.txt');

    echo 'Jumlah File: ', $zip->numFiles, '
    ';echo 'Status: ', $zip->status, '
    ';$zip->close();echo 'OK';

    } else {echo 'Gagal';

    }

    Selanjutnya, untuk tahap dekompresi, kita memanfaatkanextractTo(). Method ini menerima argumen berupa

    direktori lokasi dekompresi, yang sekaligus akan diciptakanjika direktori belum ada.

    $zip = new ZipArchive;$fl = './test.zip';

    if ($zip->open($fl) === TRUE) {// Ekstrak ke direktori unzip$zip->extractTo('./unzip');$zip->close();echo 'OK';

    } else {echo 'Gagal';

    }

    Di PEAR, kita bisa memanfaatkan paketArchive_Tar

    untuk mengompres file. Langkah penggunaan objekArchive_Tarjuga cukup sederhana.

  • 7/22/2019 Tip Dan Trik Pemrograman Php Buku Kedua

    30/30

    232

    require_once 'Archive/Tar.php';

    $tar = new Archive_Tar('test.tar');

    // Isi arsip$fl[0] = './dir/elex.gif';$fl[1] = './dir/test.doc';$fl[2] = './dir/test.txt';

    // Menciptakan file tar

    if ($tar->create($fl)) {echo 'OK';

    } else {echo 'Gagal';

    }

    Untuk mendekompres atau meng-untar file .tar di atas,gunakan method extract().

    require_once 'Archive/Tar.php';

    $tar = new Archive_Tar('test3.tar');

    // Menciptakan file zipif ($tar->extract('./untar')) {echo 'OK';

    } else {echo 'Gagal';

    }