Di PHP 4, variabel biasanya dideklarasikan menggunakan var, sedangkan di PHP 5, Anda dapat menggunakan fitur pemrograman berorientasi objek (OOP) untuk menyesuaikan visibilitas data - yaitu aksesibilitas di sini sangat mirip dengan cakupan variabel. , tetapi memberikan mekanisme kontrol yang lebih baik, ada tiga jenis pengubah visibilitas:
Publik (default)--Variabel dapat diakses atau dimodifikasi dalam lingkup global.
Dilindungi--Variabel hanya dapat diakses atau dimodifikasi di dalam kelas itu sendiri dan kelas yang diturunkan secara langsung (menggunakan pernyataan extends).
Pribadi--Variabel hanya dapat diakses atau diubah di dalam kelas.
Seperti implementasi antarmuka, pelanggaran aturan ini dalam suatu program akan menyebabkan kesalahan serius; dan seperti antarmuka, aturan tersebut ada semata-mata untuk kenyamanan pemrogram. Namun ini tidak berarti bahwa mereka dapat diabaikan. Menentukan visibilitas variabel anggota kelas tertentu dapat melindungi data di dalam objek dari pengaruh luar.
Misalkan ada kelas MySqlDB dan variabel $link dinyatakan pribadi di dalamnya, yang berarti bahwa variabel ini hanya dapat diakses dari dalam objek menggunakan variabel $ini. Hal ini mencegah penimpaan yang tidak disengaja oleh objek atau fungsi lain di luar kelas , kami akan Gunakan atribut visibilitas untuk membantu kami membuat objek kueri.
Anda dapat menganggap kueri sebagai entitas terpisah yang dapat dieksekusi dan memberikan hasil. Beberapa sistem basis data juga memiliki prosedur tersimpan. Prosedur tersimpan sangat mirip dengan fungsinya. Mereka menyimpan pernyataan kueri dan menerima parameter terkait saat dipanggil. Namun, MySQL tidak menyediakan fungsi serupa sebelum versi 5.1, dan beberapa jenis sistem manajemen basis data lainnya juga No.
Pada artikel ini, dua fitur di atas akan digabungkan ke dalam objek kueri contoh. Contoh akan mensimulasikan prosedur tersimpan dasar dan menyimpan penunjuk hasil secara internal. Untuk saat ini, fokusnya adalah mengeksekusi kueri dari objek, di mana Anda bisa memanggil fungsi query() dari objek MySqlDB.
Fungsi publik berikut dapat didefinisikan dalam objek kueri:
__construct()--Konstruktor menerima parameter yang berisi referensi instance ke objek yang mengimplementasikan antarmuka DB.
prep()--Fungsi prep() menginisialisasi prosedur kueri yang tersimpan. Ini mungkin berisi satu atau lebih placeholder terbatas, yang akan diteruskan sebagai parameter ke fungsi eksekusi(). Placeholder didefinisikan sebagai titik dua yang berhubungan dengan jumlah parameter diikuti dengan bilangan bulat dan huruf yang berhubungan dengan tipe parameter.
Kueri sederhana yang berisi placeholder terlihat seperti berikut:
SELECT col1,col2 FROM table_name WHERE col1=:1Saya
mengeksekusi()--Fungsi mengeksekusi() akan mengeksekusi kueri. Jika diinisialisasi sebelum waktunya sebagai prosedur tersimpan oleh fungsi prep(), parameter apa pun yang diteruskan akan digunakan sebagai parameter eksekusi prosedur tersimpan. Jika tidak, parameter pertama hanya akan digunakan sebagai teks kueri. Fungsi mengeksekusi() akan mengembalikan hasil setelah mengeksekusi query.
kompilasi()--Fungsi kompilasi() mirip dengan fungsi eksekusi() Faktanya, kueri tidak dieksekusi, namun menggantikan semua placeholder dalam string kueri, menerima parameter dari prosedur tersimpan, dan mengembalikan versi yang dikompilasi. dari kueri.
Anggota yang Dilindungi
Seperti disebutkan di atas, konsep visibilitas dapat digunakan untuk menyembunyikan cara kerja bagian dalam suatu objek, melindungi integritas data yang diperlukan untuk cara kerja bagian dalam. Seperti yang dijelaskan sebelumnya, penunjuk hasil yang dikembalikan oleh kueri akan disimpan sebagai atribut yang dilindungi. Anggota yang dilindungi digunakan di sini karena objek kueri database tertentu yang berasal dari objek kueri mungkin membebani beberapa fungsi inti.
Cukup
menggali teori kode
, sekarang mari kita mulai menulis kode. Pertama, buat template seperti yang ditunjukkan pada Contoh 1:Contoh 1:
Kelas templat DBQuery
dari kelas kueri database
{
/**
*Simpan referensi ke objek yang mengimplementasikan antarmuka DB.
*/
dilindungi $db;
/**
*Jika ini adalah prosedur tersimpan, setel ke true.
*/
dilindungi $stored_procedure = false
;
*Simpan kueri dengan semua string dihapus.
*/
pribadi $permintaan;
/**
* digunakan untuk mencocokkan tanda kutip dalam SQL.
*/
pribadi statis $QUOTE_MATCH = "/(".*(?db = $db;
}
persiapan fungsi publik($query)
{
$ini->prosedur_tersimpan = benar;
}
kompilasi fungsi publik($args)
{}
eksekusi fungsi publik($query)
{}
}
Fungsi persiapan
adalah template pada Contoh 1. Hal pertama yang harus Anda lakukan adalah membuat fungsi persiapan(). Untuk memastikan bahwa karakter yang tidak diberi tanda kutip secara tidak sengaja diurai sebagai placeholder, fungsi tersebut harus menghapus semua karakter dalam string dan menyimpannya sementara dalam array. String itu sendiri juga akan digantikan oleh placeholder, yang biasanya dikenali sebagai rangkaian string yang tidak boleh muncul dalam pernyataan SQL. Selama kompilasi kueri, placeholder prosedur pertama kali diganti dan kemudian string dimasukkan kembali ke dalam kueri. Hal ini dilakukan melalui fungsi preg_replace() dan fungsi panggilan balik pembantu lainnya yang digunakan sebagai fungsi preg_replace().
Contoh 2: fungsi persiapan()
/**
* Siapkan kueri sebagai prosedur tersimpan.
* @param string $query Teks kueri yang disiapkan
* @pengembalian batal
*/
persiapan fungsi publik($query)
{
$ini->prosedur_tersimpan = benar;
$this->quote_store = array(); //Hapus tanda kutip $this->query = preg_replace(self::$QUOTE_MATCH, '$this->sql_quote_replace("1"?"1":'2')', $ pertanyaan);
}
fungsi pribadi sql_quote_replace($match)
{
$angka = hitungan($ini->query_strings);
$ini->query_strings[] = $cocok;
kembalikan "$||$$angka";
}
Perhatikan di sini penggunaan atribut statis QUOTE_MATCH private, serta atribut quote_store dan fungsi sql_quote_replace(). Dibandingkan dengan protected, mendefinisikannya sebagai pribadi di sini memastikan bahwa setiap subkelas yang menggantikan metode prep() dari kelas kueri menggunakan mekanismenya sendiri untuk menghapus tanda kutip.
Fungsi kompilasiLangkah
selanjutnya adalah membangun fungsi kompilasi() dan eksekusi().
Fungsi kompilasi(), seperti yang ditunjukkan pada Contoh 3, memiliki fungsi berikut:
·Jumlah parameter yang diterima adalah variabel (yaitu, parameter variabel), yang akan cocok dengan placeholder dalam kueri.
· Periksa apakah placeholder memiliki tipe data yang benar dan ganti dengan nilai dalam parameter.
·Kembalikan kueri sebagai string tetapi jangan jalankan.
·Jika objek kueri tidak diinisialisasi sebagai prosedur tersimpan menggunakan fungsi prep(), pengecualian akan dilempar.
Contoh 3: fungsi kompilasi()
/**
* Mengembalikan kueri yang dikompilasi, tetapi tidak menjalankannya.
* @param campuran $args,... Parameter Kueri
* @return string Kueri Terkompilasi
*/
kompilasi fungsi publik($params)
{
jika (! $ini->prosedur_tersimpan) {
throw new Exception("Prosedur tersimpan belum diinisialisasi!");
}
/* Parameter substitusi*/
$params = func_get_args(); // Dapatkan parameter fungsi $query = preg_replace("/(?query);
return $this->add_strings($query); // Masukkan kembali string ke dalam kueri
}
/**
* Masukkan kembali string yang dihapus oleh fungsi prep().
*/
fungsi pribadi add_strings($string)
{
$angka = array_keys($ini->query_strings);
$hitung = hitung($angka);
$pencarian = array();
untuk($x = 0; $x < $hitung; $x++) {
$pencarian[$x] = "$||${$angka[$x]}";
}
return str_replace($pencarian, $ini->query_strings, $string);
}
/**
* Setiap kali dijalankan, placeholder dalam prosedur tersimpan diganti.
*/
fungsi yang dilindungi kompilasi_callback($params, $index, $type)
{
--$index;
/* Memberikan pengecualian */
if (! isset($params[$index])) {
throw new Exception("Prosedur tersimpan tidak menerima jumlah parameter yang diperlukan!");
}
/* Anda dapat menambahkan tipe lain di sini, seperti tanggal dan waktu. */
beralih ($tipe) {
kasus 'S':
return '"' . $this->db->escape_string($params[$index]) . '"';
merusak;
kasus 'Saya':
kembali (int) $params[$index];
merusak;
kasus 'N':
kembali (mengambang) $params[$index];
bawaan:
throw new Exception("Tipe data '$type' yang ditentukan dalam prosedur tersimpan tidak dikenali.");
}
}
Dua fungsi tambahan digunakan dalam fungsi kompilasi(). Fungsi kompilasi_callback() digunakan sebagai fungsi panggilan balik dalam pemanggilan fungsi preg_replace(). Setiap kali placeholder ditemukan dalam kueri, maka digantikan dengan nilai yang diteruskan Saat mengkompilasi nilai suatu fungsi, itu akan dieksekusi.
Fungsi mengeksekusi
Terakhir, Anda perlu membuat fungsi mengeksekusi(). Fungsi mengeksekusi() mengkompilasi query dan mengeksekusinya menggunakan objek DB, yang digunakan untuk menginisialisasi objek DBQuery di sini. Harap perhatikan dalam Contoh 4 bagaimana fungsi call_user_func_array() digunakan untuk mendapatkan kueri yang dikompilasi. Alasannya adalah karena fungsi mengeksekusi() tidak dapat menentukan jumlah argumen yang diteruskan ke fungsi tersebut hingga waktu proses.
Contoh 4: fungsi eksekusi()
/**
*
* Jalankan kueri saat ini dan ganti placeholder dengan parameter yang disediakan.
*
* @param campuran $queryParams,... Parameter kueri
* @return resource Referensi ke sumber daya yang mewakili kueri yang dieksekusi.
*/
eksekusi fungsi publik($queryParams = '')
{
//Misalnya: SELECT * FROM table WHERE name=:1S AND type=:2I AND level=:3N
$args = func_get_args();
if ($ini->prosedur_tersimpan) {
/* Memanggil fungsi kompilasi untuk mendapatkan query */
$query = call_user_func_array(array($ini, 'kompilasi'), $args);
} kalau tidak {
/* Jika prosedur tersimpan belum diinisialisasi, jalankan sebagai query standar. */
$query = $queryParams;
}
$ini->hasil = $ini->db->query($query);
kembalikan $ini->hasil;
}
Gabungkan semuanya.
Untuk mendemonstrasikan cara menggunakan objek kueri, contoh kecil dibuat di bawah ini, yang akan menggunakan objek DBQuery sebagai prosedur tersimpan dan memeriksa apakah nama pengguna dan kata sandi yang dimasukkan
benar 5:
memerlukan 'mysql_db.php5';
require_once 'query2.php5';
$db = MySqlDb baru;
$db->connect('host', 'nama pengguna', 'lulus');
$db->query('use content_management_system');
$query = DBQuery baru($db);
$query->prepare('SELECT fname,sname FROM pengguna WHERE nama pengguna=:1S DAN pword=:2S DAN expired_time<:3I ');
if ($hasil = $query->execute("visualad", "apron", time())) {
if ($db->angka_baris($hasil) == 1) {
echo('Kredensialnya benar.');
} kalau tidak {
echo('Kredensial salah dan sesi telah berakhir.');
}
} kalau tidak {
echo('Terjadi kesalahan saat menjalankan query:' .$db->error());
}
Dalam artikel ini, Anda telah melihat cara melindungi data dan membatasi visibilitas objek data menggunakan pengubah akses private, protected, dan public saat mendeklarasikan variabel kelas. Pada saat yang sama, di PHP 5, konsep ini juga dapat digunakan kelas Data lainnya untuk melindungi data internal penting.