PHP membuatnya relatif mudah untuk membangun sistem berbasis web, yang menjadi alasan popularitasnya. Namun meskipun mudah digunakan, PHP telah berkembang menjadi bahasa yang cukup canggih, dengan banyak nuansa dan kehalusan yang dapat menggigit pengembang, yang menyebabkan berjam-jam proses debug yang melelahkan. Artikel ini menyoroti sepuluh kesalahan umum yang perlu diwaspadai oleh pengembang PHP
Oleh
Ilya Sanosian
Ilya adalah konsultan IT, arsitek web, dan manajer dengan pengalaman lebih dari 12 tahun membangun dan memimpin tim
BAGIKAN
BAGIKAN
PHP membuatnya relatif mudah untuk membangun sistem berbasis web, yang menjadi alasan popularitasnya. Namun meskipun mudah digunakan, PHP telah berkembang menjadi bahasa yang cukup canggih dengan banyak kerangka kerja, nuansa, dan seluk-beluk yang dapat menggigit pengembang, yang menyebabkan proses debug yang melelahkan selama berjam-jam. Artikel ini menyoroti sepuluh kesalahan umum yang perlu diwaspadai oleh pengembang PHP
Kesalahan Umum #1. Meninggalkan referensi array yang menggantung setelah $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 5 loop
Tidak yakin bagaimana cara menggunakan foreach loop di PHP? . Sebagai contoh
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr is now array(2, 4, 6, 8)Masalahnya adalah, jika Anda tidak berhati-hati, ini juga dapat menimbulkan beberapa efek samping dan konsekuensi yang tidak diinginkan. Secara khusus, dalam contoh di atas, setelah kode dieksekusi, $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 7 akan tetap berada dalam ruang lingkup dan akan menyimpan referensi ke elemen terakhir dalam larik. Operasi selanjutnya yang melibatkan $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } _7 dapat secara tidak sengaja berakhir dengan memodifikasi elemen terakhir dalam larik
Hal utama yang perlu diingat adalah bahwa $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 5 tidak membuat ruang lingkup. Jadi, $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 7 dalam contoh di atas adalah referensi dalam cakupan teratas skrip. Pada setiap iterasi $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 5 atur referensi untuk menunjuk ke elemen berikutnya dari if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if (!isset($postData)) { echo 'post not active'; } 2. Setelah loop selesai, oleh karena itu, $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 7 masih menunjuk ke elemen terakhir dari if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if (!isset($postData)) { echo 'post not active'; } 2 dan tetap dalam cakupan
Berikut adalah contoh jenis bug yang mengelak dan membingungkan yang dapat ditimbulkannya
$array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n";Kode di atas akan menampilkan yang berikut ini
1,2,3 1,2,3 1,2,2Tidak, itu bukan salah ketik. Nilai terakhir pada baris terakhir memang 2, bukan 3
Mengapa?
Setelah melalui $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 5 loop pertama, if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if (!isset($postData)) { echo 'post not active'; } 2 tetap tidak berubah tetapi, seperti yang dijelaskan di atas, $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 7 dibiarkan sebagai referensi menggantung ke elemen terakhir di if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if (!isset($postData)) { echo 'post not active'; } 2 (sejak $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 5 loop diakses $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 7 melalui referensi)
Akibatnya, saat kita melalui putaran $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 5 kedua, "hal-hal aneh" tampaknya terjadi. Secara khusus, karena $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } _7 sekarang sedang diakses oleh nilai (i. e. , dengan salinan), $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } _5 menyalin setiap elemen if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if (!isset($postData)) { echo 'post not active'; } 2 berurutan menjadi $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 7 di setiap langkah loop. Akibatnya, inilah yang terjadi selama setiap langkah $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 5 putaran kedua
- Lulus 1. Salinan if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if ($_POST['active']) { echo 'post not active'; } 7 (i. e. , “1”) menjadi $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 7 (yang mengacu pada if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if ($_POST['active']) { echo 'post not active'; } 9), jadi if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if ($_POST['active']) { echo 'post not active'; } 9 sekarang sama dengan 1. Jadi if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if (!isset($postData)) { echo 'post not active'; } _2 sekarang berisi [1, 2, 1]
- Lulus 2. Salinan $data = fetchRecordFromStorage($storage, $identifier); if (! array_key_exists('keyShouldBeSet', $data)) { // do this if 'keyShouldBeSet' isn't set } 2 (i. e. , “2”) menjadi $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 7 (yang mengacu pada if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if ($_POST['active']) { echo 'post not active'; } 9), jadi if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if ($_POST['active']) { echo 'post not active'; } 9 sekarang sama dengan 2. Jadi if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if (!isset($postData)) { echo 'post not active'; } _2 sekarang berisi [1, 2, 2]
- Lulus 3. Salinan if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if ($_POST['active']) { echo 'post not active'; } 9 (yang sekarang sama dengan “2”) menjadi $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 7 (yang mengacu pada if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if ($_POST['active']) { echo 'post not active'; } 9), jadi if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if ($_POST['active']) { echo 'post not active'; } 9 tetap sama dengan 2. Jadi if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if (!isset($postData)) { echo 'post not active'; } _2 sekarang berisi [1, 2, 2]
Untuk tetap mendapatkan manfaat menggunakan referensi dalam $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 5 loop tanpa menanggung risiko masalah semacam ini, panggil if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 3 pada variabel, segera setelah $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 5 loop, untuk menghapus referensi; . g
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value); // $value no longer references $arr[3]Kesalahan Umum #2. Kesalahpahaman if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 5 perilaku
Terlepas dari namanya, if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } _5 tidak hanya mengembalikan false jika item tidak ada, tetapi juga mengembalikan if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 7 untuk if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 8 nilai
Perilaku ini lebih bermasalah daripada yang terlihat pada awalnya dan merupakan sumber masalah yang umum
Pertimbangkan yang berikut ini
$data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set }Penulis kode ini mungkin ingin memeriksa apakah if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 9 telah ditetapkan di class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; 0. Namun, seperti yang telah dibahas, class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; _1 juga akan menghasilkan false jika class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; 2 telah disetel, tetapi disetel ke if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 8. Jadi logika di atas cacat
Ini contoh lainnya
if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if (!isset($postData)) { echo 'post not active'; } _Kode di atas mengasumsikan bahwa jika class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; _4 mengembalikan class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; 5, maka class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; 6 harus ditetapkan, dan oleh karena itu class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; 7 akan mengembalikan class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; 5. Sebaliknya, kode di atas mengasumsikan bahwa satu-satunya cara class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; 7 akan mengembalikan if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 7 adalah jika class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; 4 mengembalikan if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 7 juga
Bukan
Seperti yang dijelaskan, class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; 7 juga akan mengembalikan if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 7 jika $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 05 disetel ke if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 8. Oleh karena itu, class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; _7 dapat mengembalikan if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 7 bahkan jika class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; 4 dikembalikan class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; 5. Jadi sekali lagi, logika di atas cacat
Dan omong-omong, sebagai poin tambahan, jika maksud dalam kode di atas benar-benar untuk memeriksa lagi apakah class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; 4 kembali benar, mengandalkan if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 5 karena ini adalah keputusan pengkodean yang buruk dalam hal apa pun. Sebaliknya, akan lebih baik untuk memeriksa ulang class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; 4; . e
if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if ($_POST['active']) { echo 'post not active'; }Namun, untuk kasus-kasus, di mana penting untuk memeriksa apakah suatu variabel benar-benar disetel (mis. e. , untuk membedakan antara variabel yang tidak disetel dan variabel yang disetel ke if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 8), metode $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 15 adalah solusi yang jauh lebih kuat
Misalnya, kita dapat menulis ulang yang pertama dari dua contoh di atas sebagai berikut
$data = fetchRecordFromStorage($storage, $identifier); if (! array_key_exists('keyShouldBeSet', $data)) { // do this if 'keyShouldBeSet' isn't set }Selain itu, dengan menggabungkan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 15 dengan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 17, kita dapat memeriksa dengan andal apakah variabel dalam lingkup saat ini telah ditetapkan atau tidak
if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope }Kesalahan Umum #3. Kebingungan tentang kembali dengan referensi vs. berdasarkan nilai
Pertimbangkan potongan kode ini
class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test'];Jika Anda menjalankan kode di atas, Anda akan mendapatkan yang berikut
$array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _0Apa yang salah?
Masalahnya adalah bahwa kode di atas membingungkan mengembalikan array dengan referensi dengan mengembalikan array berdasarkan nilai. Kecuali jika Anda secara eksplisit memberi tahu PHP untuk mengembalikan array dengan referensi (mis. e. , dengan menggunakan$array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _18), PHP secara default akan mengembalikan array "berdasarkan nilai". Ini berarti salinan array akan dikembalikan dan oleh karena itu fungsi yang dipanggil dan pemanggil tidak akan mengakses instance array yang sama
Jadi panggilan di atas ke $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _19 mengembalikan salinan array ________11______20 daripada referensi untuk itu. Dengan mengingat hal itu, mari kita tinjau kembali dua baris kunci dari contoh di atas
$array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _1Satu kemungkinan perbaikan adalah dengan menyimpan salinan pertama dari larik $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 20 yang dikembalikan oleh $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 19 dan kemudian mengoperasikan salinan itu selanjutnya; . g
$array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _2Kode itu akan berfungsi dengan baik (mis. e. , itu akan menampilkan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _23 tanpa menghasilkan pesan "indeks tidak terdefinisi"), tetapi tergantung pada apa yang ingin Anda capai, pendekatan ini mungkin atau mungkin tidak memadai. Secara khusus, kode di atas tidak akan mengubah larik $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 20 asli. Jadi jika Anda ingin modifikasi Anda (seperti menambahkan elemen 'test') untuk mempengaruhi array asli, Anda perlu memodifikasi fungsi $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 19 untuk mengembalikan referensi ke array $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 20 itu sendiri. Hal ini dilakukan dengan menambahkan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 18 sebelum nama fungsi, sehingga menunjukkan bahwa itu harus mengembalikan referensi; . e
$array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _3Output dari ini akan menjadi $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _23, seperti yang diharapkan
Tetapi untuk membuatnya lebih membingungkan, pertimbangkan potongan kode berikut
$array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _4Jika Anda menebak bahwa ini akan menghasilkan kesalahan "indeks tidak terdefinisi" yang sama seperti contoh ________11______29 kami sebelumnya, Anda salah. Faktanya, kode ini akan berfungsi dengan baik. Alasannya adalah, tidak seperti array, PHP selalu mengirimkan objek dengan referensi. ($array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 30 adalah objek SPL, yang sepenuhnya meniru penggunaan array, tetapi berfungsi sebagai objek. )
Seperti yang ditunjukkan contoh-contoh ini, tidak selalu jelas dalam PHP apakah Anda berurusan dengan salinan atau referensi. Oleh karena itu penting untuk memahami perilaku default ini (mis. e. , variabel dan array dilewatkan dengan nilai;
Semua yang dikatakan, penting untuk dicatat bahwa praktik mengembalikan referensi ke array atau $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 30 umumnya adalah sesuatu yang harus dihindari, karena memberikan pemanggil kemampuan untuk mengubah data pribadi instance. Ini "terbang di depan" enkapsulasi. Sebaliknya, lebih baik menggunakan "getter" dan "setter" gaya lama, mis. g
$array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _5Pendekatan ini memberi penelepon kemampuan untuk menyetel atau mendapatkan nilai apa pun dalam larik tanpa memberikan akses publik ke larik $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 20 itu sendiri.
Kesalahan Umum #4. Melakukan kueri dalam satu lingkaran
Tidak jarang menemukan hal seperti ini jika PHP Anda tidak berfungsi
$array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _6Meskipun mungkin sama sekali tidak ada yang salah di sini, tetapi jika Anda mengikuti logika dalam kode, Anda mungkin menemukan bahwa panggilan yang tampak tidak bersalah di atas ke $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 33 pada akhirnya menghasilkan semacam kueri, seperti
$array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _7Akibatnya, setiap iterasi dari loop di atas akan menghasilkan kueri terpisah ke database. Jadi jika, misalnya, Anda memberikan larik 1.000 nilai ke loop, itu akan menghasilkan 1.000 kueri terpisah ke sumber daya. Jika skrip semacam itu dipanggil dalam banyak utas, itu berpotensi menghentikan sistem
Oleh karena itu, sangat penting untuk mengenali kapan kueri dibuat oleh kode Anda dan, jika memungkinkan, kumpulkan nilai lalu jalankan satu kueri untuk mengambil semua hasil
Salah satu contoh tempat yang cukup umum untuk menghadapi kueri yang dilakukan secara tidak efisien (mis. e. , dalam satu lingkaran) adalah saat formulir diposting dengan daftar nilai (ID, misalnya). Kemudian, untuk mengambil data rekaman lengkap untuk setiap ID, kode akan mengulang melalui array dan melakukan kueri SQL terpisah untuk setiap ID. Ini akan sering terlihat seperti ini
$array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _8Tetapi hal yang sama dapat dicapai dengan lebih efisien dalam satu kueri SQL sebagai berikut
$array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _9Oleh karena itu penting untuk mengenali kapan kueri dibuat, baik secara langsung atau tidak langsung, oleh kode Anda. Jika memungkinkan, kumpulkan nilai lalu jalankan satu kueri untuk mengambil semua hasil. Namun kehati-hatian juga harus dilakukan di sana, yang membawa kita ke kesalahan umum PHP berikutnya…
Kesalahan Umum #5. Headfakes penggunaan memori dan inefisiensi
Meskipun mengambil banyak record sekaligus jelas lebih efisien daripada menjalankan satu kueri untuk diambil setiap baris, pendekatan seperti itu berpotensi menyebabkan kondisi "kehabisan memori" di $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 34 saat menggunakan ekstensi $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 35 PHP
Untuk mendemonstrasikan, mari kita lihat kotak uji dengan sumber daya terbatas (RAM 512MB), MySQL, dan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 36
Kami akan mem-bootstrap tabel database seperti ini
1,2,3 1,2,3 1,2,2 0Oke, sekarang mari kita periksa penggunaan sumber daya
1,2,3 1,2,3 1,2,2 1Keluaran
1,2,3 1,2,3 1,2,2 2Keren. Sepertinya kueri dikelola dengan aman secara internal dalam hal sumber daya
Hanya untuk memastikan, mari tingkatkan batasnya sekali lagi dan atur menjadi 100.000. Uh oh. Ketika kita melakukan itu, kita dapatkan
1,2,3 1,2,3 1,2,2 3Apa yang terjadi?
Masalahnya di sini adalah cara kerja modul ________11______35 PHP. Ini benar-benar hanya proxy untuk $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 34, yang melakukan pekerjaan kotor. Ketika sebagian data dipilih, itu langsung masuk ke memori. Karena memori ini tidak dikelola oleh pengelola PHP, $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 39 tidak akan menunjukkan peningkatan penggunaan sumber daya saat kami mencapai batas dalam kueri kami. Ini mengarah pada masalah seperti yang ditunjukkan di atas di mana kita tertipu untuk berpuas diri dengan berpikir bahwa manajemen ingatan kita baik-baik saja. Namun kenyataannya, manajemen ingatan kita sangat cacat dan kita bisa mengalami masalah seperti yang ditunjukkan di atas
Anda setidaknya dapat menghindari headfake di atas (walaupun itu sendiri tidak akan meningkatkan penggunaan memori Anda) dengan menggunakan modul $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 40. $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _40 dikompilasi sebagai ekstensi PHP asli dan menggunakan pengelola memori PHP
Oleh karena itu, jika kita menjalankan pengujian di atas menggunakan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 40 daripada $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 35, kita mendapatkan gambaran yang jauh lebih realistis tentang penggunaan memori kita
1,2,3 1,2,3 1,2,2 4Dan itu bahkan lebih buruk dari itu. Menurut dokumentasi PHP, $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _35 menggunakan sumber daya dua kali lebih banyak dari $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 40 untuk menyimpan data, jadi skrip asli yang menggunakan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 35 benar-benar menggunakan lebih banyak memori daripada yang ditampilkan di sini (kira-kira dua kali lebih banyak)
Untuk menghindari masalah seperti itu, pertimbangkan untuk membatasi ukuran kueri Anda dan menggunakan perulangan dengan sedikit iterasi; . g
1,2,3 1,2,3 1,2,2 5Ketika kami mempertimbangkan kesalahan PHP ini dan di atasnya, kami menyadari bahwa ada keseimbangan yang sehat yang idealnya harus dicapai oleh kode Anda antara, di satu sisi, membuat kueri Anda terlalu terperinci dan berulang, vs. membuat setiap kueri individual Anda terlalu besar. Seperti kebanyakan hal dalam hidup, keseimbangan dibutuhkan;
Kesalahan Umum #6. Mengabaikan masalah Unicode/UTF-8
Dalam beberapa hal, ini sebenarnya lebih merupakan masalah dalam PHP itu sendiri daripada sesuatu yang akan Anda temui saat men-debug PHP, tetapi tidak pernah ditangani secara memadai. Inti PHP 6 harus dibuat sadar-Unicode, tetapi itu ditunda ketika pengembangan PHP 6 ditangguhkan kembali pada tahun 2010
Tapi itu tidak berarti membebaskan pengembang dari menyerahkan UTF-8 dengan benar dan menghindari asumsi yang salah bahwa semua string akan menjadi "ASCII tua biasa". Kode yang gagal menangani string non-ASCII dengan benar terkenal karena memasukkan heisenbugs degil ke dalam kode Anda. Bahkan panggilan sederhana $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _47 dapat menyebabkan masalah jika seseorang dengan nama belakang seperti "Schrödinger" mencoba mendaftar ke sistem Anda
Berikut daftar periksa kecil untuk menghindari masalah seperti itu dalam kode Anda
- Jika Anda tidak tahu banyak tentang Unicode dan UTF-8, setidaknya Anda harus mempelajari dasar-dasarnya. Ada primer yang bagus di sini
- Pastikan untuk selalu menggunakan fungsi $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _48 alih-alih fungsi string lama (pastikan ekstensi "multibyte" disertakan dalam build PHP Anda)
- Pastikan database dan tabel Anda diatur untuk menggunakan Unicode (banyak build MySQL masih menggunakan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 49 secara default)
- Ingatlah bahwa $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 50 mengonversi simbol non-ASCII (mis. g. , “Schrödinger” menjadi “Schr\u00f6dinger”) tetapi $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 51 tidak
- Pastikan file kode PHP Anda juga dikodekan UTF-8 untuk menghindari tabrakan saat menggabungkan string dengan konstanta string yang dikodekan atau dikonfigurasi
Sumber daya yang sangat berharga dalam hal ini adalah UTF-8 Primer untuk PHP dan MySQL yang diposting oleh Francisco Claria di blog ini
Kesalahan Umum #7. Dengan asumsi $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _52 akan selalu berisi data POST Anda
Terlepas dari namanya, array $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 52 tidak akan selalu berisi data POST Anda dan dapat dengan mudah ditemukan kosong. Untuk memahami ini, mari kita lihat sebuah contoh. Asumsikan kita membuat permintaan server dengan panggilan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 54 sebagai berikut
1,2,3 1,2,3 1,2,2 6(Kebetulan, perhatikan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 55 di sini. Kami mengirimkan data sebagai JSON, yang cukup populer untuk API. Ini adalah default, misalnya, untuk memposting di layanan AngularJS $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 56. )
Di sisi server contoh kami, kami hanya membuang array $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 52
1,2,3 1,2,3 1,2,2 7Anehnya, hasilnya akan seperti itu
1,2,3 1,2,3 1,2,2 8Mengapa?
Jawabannya adalah PHP hanya mem-parsing payload POST secara otomatis jika memiliki tipe konten $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 59 atau $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 60. Alasan untuk ini bersifat historis — kedua jenis konten ini pada dasarnya adalah satu-satunya yang digunakan bertahun-tahun yang lalu ketika $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 52 PHP diimplementasikan. Jadi dengan jenis konten lainnya (bahkan yang cukup populer saat ini, seperti $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 62), PHP tidak memuat muatan POST secara otomatis
Karena $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _52 adalah superglobal, jika kita menggantinya sekali (sebaiknya di awal skrip kita), nilai yang dimodifikasi (i. e. , termasuk payload POST) kemudian akan dapat direferensikan di seluruh kode kita. Ini penting karena $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _52 umumnya digunakan oleh kerangka kerja PHP dan hampir semua skrip khusus untuk mengekstrak dan mengubah data permintaan
Jadi, misalnya, saat memproses payload POST dengan tipe konten $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 62, kita perlu mengurai konten permintaan secara manual (i. e. , mendekode data JSON) dan menimpa variabel $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 52, sebagai berikut
1,2,3 1,2,3 1,2,2 _9Kemudian saat kita membuang larik $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _52, kita melihat bahwa larik tersebut menyertakan muatan POST dengan benar; . g
Kesalahan Umum #8. Berpikir bahwa PHP mendukung tipe data karakter
Lihatlah contoh kode ini dan coba tebak apa yang akan dicetak
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value); // $value no longer references $arr[3] 1Jika Anda menjawab 'a' hingga 'z', Anda mungkin terkejut mengetahui bahwa Anda salah
Ya, itu akan mencetak 'a' hingga 'z', tetapi kemudian juga akan mencetak 'aa' hingga 'yz'. Mari kita lihat alasannya
Di PHP tidak ada tipe data ________11______68; . Dengan mengingat hal itu, menambah $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _69 $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 71 dalam hasil PHP $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 72
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value); // $value no longer references $arr[3] 2Namun untuk lebih membingungkan, $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _72 secara leksikografis kurang dari $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 71
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value); // $value no longer references $arr[3] 3Itu sebabnya kode sampel yang disajikan di atas mencetak huruf $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 75 hingga $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 71, tetapi kemudian juga mencetak $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 72 hingga $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 78. Itu berhenti ketika mencapai $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _ 79, yang merupakan nilai pertama yang ditemuinya “lebih besar dari” $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 71
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value); // $value no longer references $arr[3] 4Oleh karena itu, inilah salah satu cara untuk mengulang nilai 'a' hingga 'z' dengan benar di PHP
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value); // $value no longer references $arr[3] 5Atau sebagai alternatif
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value); // $value no longer references $arr[3] 6Kesalahan Umum #9. Mengabaikan standar pengkodean
Meskipun mengabaikan standar pengkodean tidak secara langsung mengarah pada perlunya men-debug kode PHP, ini mungkin masih menjadi salah satu hal terpenting untuk dibahas di sini
Mengabaikan standar pengkodean dapat menyebabkan banyak masalah pada suatu proyek. Paling-paling, itu menghasilkan kode yang tidak konsisten (karena setiap pengembang "melakukan hal mereka sendiri"). Tetapi yang paling buruk, itu menghasilkan kode PHP yang tidak berfungsi atau bisa sulit (terkadang hampir tidak mungkin) untuk dinavigasi, sehingga sangat sulit untuk men-debug, meningkatkan, memelihara. Dan itu berarti berkurangnya produktivitas tim Anda, termasuk banyak usaha yang sia-sia (atau setidaknya tidak perlu).
Untungnya bagi pengembang PHP, ada Rekomendasi Standar PHP (PSR), yang terdiri dari lima standar berikut
- PSR-0. Standar Pemuatan Otomatis
- PSR-1. Standar Pengodean Dasar
- PSR-2. Panduan Gaya Pengodean
- PSR-3. Antarmuka Pencatat
- PSR-4. Pemuat otomatis
PSR awalnya dibuat berdasarkan masukan dari pengelola platform yang paling dikenal di pasar. Zend, Drupal, Symfony, Joomla, dan lainnya berkontribusi pada standar ini, dan sekarang mengikutinya. Bahkan PEAR, yang berusaha menjadi standar selama bertahun-tahun sebelumnya, berpartisipasi dalam PST sekarang
Dalam arti tertentu, hampir tidak masalah apa standar pengkodean Anda, selama Anda menyetujui standar dan menaatinya, tetapi mengikuti PSR umumnya merupakan ide yang bagus kecuali Anda memiliki alasan kuat pada proyek Anda untuk melakukan sebaliknya. Semakin banyak tim dan proyek yang sesuai dengan PSR. Tt pasti diakui pada saat ini sebagai "standar" oleh sebagian besar pengembang PHP, jadi menggunakannya akan membantu memastikan bahwa pengembang baru terbiasa dan nyaman dengan standar pengkodean Anda ketika mereka bergabung dengan tim Anda
Kesalahan Umum #10. Menyalahgunakan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _81
Beberapa pengembang PHP suka menggunakan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _81 untuk pemeriksaan boolean untuk hampir semua hal. Namun, ada kasus di mana hal ini dapat menyebabkan kebingungan
Pertama, mari kita kembali ke array dan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 30 instance (yang meniru array). Mengingat kesamaan mereka, mudah untuk mengasumsikan bahwa array dan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 30 contoh akan berperilaku identik. Namun, ini terbukti sebagai asumsi yang berbahaya. Misalnya di PHP5. 0
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value); // $value no longer references $arr[3] 7Dan yang lebih buruk lagi, hasilnya akan berbeda sebelum PHP 5. 0
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value); // $value no longer references $arr[3] 8Pendekatan ini sayangnya cukup populer. Misalnya, ini adalah cara $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 85 dari Zend Framework 2 mengembalikan data saat memanggil $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 86 pada $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 87 hasil seperti yang disarankan oleh dokumen. Pengembang dapat dengan mudah menjadi korban kesalahan ini dengan data tersebut
Untuk menghindari masalah ini, pendekatan yang lebih baik untuk memeriksa struktur array kosong adalah dengan menggunakan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 88
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value); // $value no longer references $arr[3] _9Dan kebetulan, karena PHP menampilkan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 89 ke if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 7, $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 88 juga dapat digunakan dalam kondisi $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 92 untuk memeriksa array kosong. Perlu juga dicatat bahwa, dalam PHP, $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 88 adalah kompleksitas konstan ($array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 94 operasi) pada array, yang membuatnya semakin jelas bahwa ini adalah pilihan yang tepat
Contoh lain ketika $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _81 bisa berbahaya adalah ketika menggabungkannya dengan fungsi kelas sihir $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 96. Mari kita definisikan dua kelas dan miliki properti $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 23 di keduanya
Pertama mari kita definisikan kelas $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _98 yang menyertakan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 23 sebagai properti normal
$data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } 0Kemudian mari kita tentukan kelas 1,2,3 1,2,3 1,2,2 00 yang menggunakan operator ajaib $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 96 untuk mengakses properti $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 23
$data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } _1Oke, sekarang mari kita lihat apa yang terjadi saat kita mencoba mengakses properti $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 23 dari masing-masing kelas ini
$data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } _2Baik sejauh ini
Tapi sekarang mari kita lihat apa yang terjadi ketika kita memanggil $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 81 pada masing-masing
$data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } _3Aduh. Jadi jika kita mengandalkan $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _81, kita dapat disesatkan untuk percaya bahwa properti $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 23 dari 1,2,3 1,2,3 1,2,2 07 kosong, padahal kenyataannya diatur ke 1,2,3 1,2,3 1,2,2 08
Sayangnya, jika kelas menggunakan fungsi $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _96 ajaib untuk mengambil nilai properti, tidak ada cara mudah untuk memeriksa apakah nilai properti itu kosong atau tidak. Di luar ruang lingkup kelas, Anda benar-benar hanya dapat memeriksa apakah nilai if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 8 akan dikembalikan, dan itu tidak berarti bahwa kunci yang sesuai tidak disetel, karena sebenarnya dapat disetel ke if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope } 8
Sebaliknya, jika kami mencoba mereferensikan properti yang tidak ada dari instance kelas $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; 98 , kami akan mendapatkan pemberitahuan yang serupa dengan berikut ini
$data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set } _4Jadi poin utama di sini adalah bahwa metode $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n"; foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n"; _81 harus digunakan dengan hati-hati karena dapat memberikan hasil yang membingungkan - atau bahkan berpotensi menyesatkan -, jika seseorang tidak berhati-hati
Bungkus
Kemudahan penggunaan PHP dapat menidurkan pengembang ke dalam rasa nyaman yang salah, membuat mereka rentan terhadap debugging PHP yang panjang karena beberapa nuansa dan keistimewaan bahasa. Ini dapat mengakibatkan PHP tidak berfungsi dan masalah seperti yang dijelaskan di sini
Bahasa PHP telah berkembang secara signifikan selama 20 tahun sejarahnya. Mengakrabkan diri dengan seluk-beluknya adalah usaha yang bermanfaat, karena akan membantu memastikan bahwa perangkat lunak yang Anda hasilkan lebih dapat diskalakan, tangguh, dan dapat dipelihara.
Tag
PHPFreelancer? Temukan pekerjaan Anda selanjutnya.
Pekerjaan Pengembang PHP
Lihat profil lengkap
Ilya Sanosian
Insinyur Perangkat Lunak
Tentang Penulis
Ilya adalah konsultan IT, arsitek web, dan manajer dengan pengalaman lebih dari satu dekade dalam membangun dan memimpin tim, melatih rekan kerja, dan membuat proses bekerja dalam jangka panjang dengan membangun alur kerja yang efektif dan dokumentasi yang transparan. Pengetahuan domain Ilya meliputi robotika, berita, keamanan online, perawatan kesehatan, pemasaran online, dan perjalanan
Pekerjakan Ilya
Komentar
Phil Poore
Artikel yang sangat bagus, sangat informatif
Phil Poore
Artikel yang sangat bagus, sangat informatif
thebeline
Astaga, beberapa di antaranya melekat pada saya (seperti kueri di dalam loop, kami bahkan memiliki satu atau dua set yang [sebelum saya menulis ulang] kueri di dalam loop yang memicu loop lebih lanjut dengan kueri. kekacauan busuk). Namun, saya tidak tahu apakah saya akan menyebut ini sebagai 10 yang paling umum, yaitu karena, meskipun ini membingungkan, pengembang biasanya menemukan masalah ini dan menyelesaikannya sesuai dengan kebutuhan mereka sekali, dan melanjutkan. Bukan karena kesalahan artikelnya, tetapi dengan daftar cucian seperti yang dimiliki PHP, memilih hanya 10 kekurangan adalah hal yang mustahil. Daftar ini gila. http. //eev. ee/blog/2012/04/09/php-a-fractal-of-bad-design/
thebeline
Astaga, beberapa di antaranya melekat pada saya (seperti kueri di dalam loop, kami bahkan memiliki satu atau dua set yang [sebelum saya menulis ulang] kueri di dalam loop yang memicu loop lebih lanjut dengan kueri. kekacauan busuk). Namun, saya tidak tahu apakah saya akan menyebut ini sebagai 10 yang paling umum, yaitu karena, meskipun ini membingungkan, pengembang biasanya menemukan masalah ini dan menyelesaikannya sesuai dengan kebutuhan mereka sekali, dan melanjutkan. Bukan karena kesalahan artikelnya, tetapi dengan daftar cucian seperti yang dimiliki PHP, memilih hanya 10 kekurangan adalah hal yang mustahil. Daftar ini gila. http. //eev. ee/blog/2012/04/09/php-a-fractal-of-bad-design/
Alejandro Pablo Tkachuk
10 besar
Alejandro Pablo Tkachuk
10 besar
Wilhelm Murdoch
Ya Tuhan. Ini adalah artikel saya ketika orang bertanya mengapa saya tidak menyukai bahasanya. Jelas, setiap bahasa memiliki kekurangannya, tetapi, setelah 10 tahun PHP, rasanya sangat tidak enak di mulut saya
Wilhelm Murdoch
Ya Tuhan. Ini adalah artikel saya ketika orang bertanya mengapa saya tidak menyukai bahasanya. Jelas, setiap bahasa memiliki kekurangannya, tetapi, setelah 10 tahun PHP, rasanya sangat tidak enak di mulut saya
Sander
FWIW, di #10 Anda mengatakan "// PHP 5. 0 atau lebih baru. $array = [];" Notasi array itu TIDAK bekerja di PHP 5. 0-5. 3, sejak diperkenalkan di PHP 5. 4
Sander
FWIW, di #10 Anda mengatakan "// PHP 5. 0 atau lebih baru. $array = [];" Notasi array itu TIDAK bekerja di PHP 5. 0-5. 3, sejak diperkenalkan di PHP 5. 4
Bruno Seixas
Artikel bagus. Terima kasih =) Setiap hari kami dapat mempelajari sesuatu, meningkatkan gaya pengkodean kami. Ini menunjukkan ke arah yang benar
Bruno Seixas
Artikel bagus. Terima kasih =) Setiap hari kami dapat mempelajari sesuatu, meningkatkan gaya pengkodean kami. Ini menunjukkan ke arah yang benar
Scott
Semuanya berjalan dengan baik sampai Anda menyebutkan PSR2. Aduh
Scott
Semuanya berjalan dengan baik sampai Anda menyebutkan PSR2. Aduh
WillHaven
Apa bahasa pengantar Anda sekarang?
WillHaven
Apa bahasa pengantar Anda sekarang?
Vojtech Kurka
Hanya peringatan. Saat menggunakan array yang tidak kosong, count($array) dapat memperlambat kode Anda secara signifikan. Terlebih lagi, beberapa pengembang cenderung menggunakan if(count($arr)). di dalam loop. Saya tidak akan merekomendasikan praktik ini untuk array
Vojtech Kurka
Hanya peringatan. Saat menggunakan array yang tidak kosong, count($array) dapat memperlambat kode Anda secara signifikan. Terlebih lagi, beberapa pengembang cenderung menggunakan if(count($arr)). di dalam loop. Saya tidak akan merekomendasikan praktik ini untuk array
Hazem
Terima kasih untuk artikelnya sangat informatif dan saya menyukainya tetapi "Terlepas dari namanya, isset() tidak hanya mengembalikan false jika item tidak ada, tetapi juga mengembalikan false untuk nilai null. " salah, mengembalikan true jika nilainya salah, dan mengembalikan false hanya jika nilainya nol
Hazem
Terima kasih untuk artikelnya sangat informatif dan saya menyukainya tetapi "Terlepas dari namanya, isset() tidak hanya mengembalikan false jika item tidak ada, tetapi juga mengembalikan false untuk nilai null. " salah, mengembalikan true jika nilainya salah, dan mengembalikan false hanya jika nilainya nol
Maxim Naguchev
> Sayangnya, jika kelas menggunakan fungsi __get() ajaib untuk mengambil nilai properti, > tidak ada cara mudah untuk memeriksa apakah nilai properti itu kosong atau tidak. Itu tidak benar. Konstruksi empty($var) pertama coba panggil isset() dan, jika variabel disetel, periksa, apakah variabel kosong atau tidak. Jadi jika kelas menggunakan metode ajaib _get(), ia harus menyadari metode ajaib _isset(). Dan empty() akan berfungsi dengan baik
Maxim Naguchev
> Sayangnya, jika kelas menggunakan fungsi __get() ajaib untuk mengambil nilai properti, > tidak ada cara mudah untuk memeriksa apakah nilai properti itu kosong atau tidak. Itu tidak benar. Konstruksi empty($var) pertama coba panggil isset() dan, jika variabel disetel, periksa, apakah variabel kosong atau tidak. Jadi jika kelas menggunakan metode ajaib _get(), ia harus menyadari metode ajaib _isset(). Dan empty() akan berfungsi dengan baik
Myroniar
membantu, terima kasih
Myroniar
membantu, terima kasih
Dusan Lukic
Terima kasih untuk artikel yang sangat berguna ini. Saya hanya ingin melakukan koreksi kecil, Anda mengatakan bahwa "PHP selalu melewati objek dengan referensi" yang sebenarnya tidak sepenuhnya benar, karena PHP menggunakan mekanisme khusus untuk objek yang mirip dengan melewati referensi, ada di kalimat kedua di . http. //php. net/manual/en/bahasa. oop5. referensi. php Selain itu, artikel bagus
Dusan Lukic
Terima kasih untuk artikel yang sangat berguna ini. Saya hanya ingin melakukan koreksi kecil, Anda mengatakan bahwa "PHP selalu melewati objek dengan referensi" yang sebenarnya tidak sepenuhnya benar, karena PHP menggunakan mekanisme khusus untuk objek yang mirip dengan melewati referensi, ada di kalimat kedua di . http. //php. net/manual/en/bahasa. oop5. referensi. php Selain itu, artikel bagus
Roy
Artikel yang ditulis dengan sangat baik dengan konten asli. Sudah selesai dilakukan dengan baik
Roy
Artikel yang ditulis dengan sangat baik dengan konten asli. Sudah selesai dilakukan dengan baik
Donato C. Laynes Gonzales
Tentang #2, $_POST['aktif'] akan menghasilkan E_NOTICE jika kunci tidak ada (kotak centang dan radio tidak dicentang) Jika Anda peduli dengan kinerja dan keamanan PHP, ini penting. array_key_exists adalah opsi yang lebih baik seperti yang dijelaskan. Salam
Donato C. Laynes Gonzales
Tentang #2, $_POST['aktif'] akan menghasilkan E_NOTICE jika kunci tidak ada (kotak centang dan radio tidak dicentang) Jika Anda peduli dengan kinerja dan keamanan PHP, ini penting. array_key_exists adalah opsi yang lebih baik seperti yang dijelaskan. Salam
Aschwin Wesselius
Anehnya, tidak ada yang menyebutkan penggunaan /root/test. php. Saya tahu, ini adalah lingkungan lokal dan semuanya, tetapi masih menjalankan skrip pengujian di folder root Anda, terutama pengujian yang memakan banyak memori. Apakah itu dilakukan dengan sengaja?
Aschwin Wesselius
Anehnya, tidak ada yang menyebutkan penggunaan /root/test. php. Saya tahu, ini adalah lingkungan lokal dan semuanya, tetapi masih menjalankan skrip pengujian di folder root Anda, terutama pengujian yang memakan banyak memori. Apakah itu dilakukan dengan sengaja?
ajaniashish
Artikel bagus Ilya, sepenuhnya setuju dengan pernyataan Anda "jam debugging yang menarik rambut". Seringkali ketika datang ke pengoptimalan situs web untuk kecepatan, kami menemukan kueri yang tidak perlu di dalam loop. Barang bagus
ajaniashish
Artikel bagus Ilya, sepenuhnya setuju dengan pernyataan Anda "jam debugging yang menarik rambut". Seringkali ketika datang ke pengoptimalan situs web untuk kecepatan, kami menemukan kueri yang tidak perlu di dalam loop. Barang bagus
Scott
Karena PSR-2 dimaksudkan sebagai One True Coding Standard. Ya, standar pengkodean adalah suatu keharusan, tetapi tidak harus PSR-2. Bahkan artikel ini mengatakan Anda memerlukan "alasan kuat" untuk tidak menggunakannya yang tidak benar
Scott
Karena PSR-2 dimaksudkan sebagai One True Coding Standard. Ya, standar pengkodean adalah suatu keharusan, tetapi tidak harus PSR-2. Bahkan artikel ini mengatakan Anda memerlukan "alasan kuat" untuk tidak menggunakannya yang tidak benar
Jason Edgecombe
Dalam tips #4 dan #5, menggunakan query() dengan rangkaian string adalah contoh buku teks tentang kerentanan injeksi SQL. Lebih baik menggunakan pernyataan yang disiapkan atau setidaknya memperingatkan pembaca bahwa variabel input harus dibersihkan terlebih dahulu. Harap perbarui artikel agar orang tidak membabi buta menggunakan kode contoh dan menganggapnya aman. Artikel ini juga memerlukan tanggal kapan artikel terakhir ditulis atau diperbarui sehingga pembaca dapat mengetahui apakah informasi tersebut sudah basi
Jason Edgecombe
Dalam tips #4 dan #5, menggunakan query() dengan rangkaian string adalah contoh buku teks tentang kerentanan injeksi SQL. Lebih baik menggunakan pernyataan yang disiapkan atau setidaknya memperingatkan pembaca bahwa variabel input harus dibersihkan terlebih dahulu. Harap perbarui artikel agar orang tidak membabi buta menggunakan kode contoh dan menganggapnya aman. Artikel ini juga memerlukan tanggal kapan artikel terakhir ditulis atau diperbarui sehingga pembaca dapat mengetahui apakah informasi tersebut sudah basi
Taman Grant Wesley
Itu hal yang sama. null adalah satu-satunya nilai null
Taman Grant Wesley
Itu hal yang sama. null adalah satu-satunya nilai null
Jeff Mattson
Dalam kesalahan umum #2. Bukankah seharusnya contoh Anda terbaca jika (. $_POST['aktif']) { echo 'posting tidak aktif';
Jeff Mattson
Dalam kesalahan umum #2. Bukankah seharusnya contoh Anda terbaca jika (. $_POST['aktif']) { echo 'posting tidak aktif';
M. S. vinyesh
apakah ada alternatif?
M. S. vinyesh
apakah ada alternatif?
Vojtech Kurka
menggunakan variabel sebagai penghitung
Vojtech Kurka
menggunakan variabel sebagai penghitung
Erutan409
Saya menemukan yang berikut ini tidak masuk akal. Kawat gigi pembuka untuk kelas HARUS di baris berikutnya, dan kawat gigi penutup HARUS di baris berikutnya setelah badan. Kurung buka untuk metode HARUS di baris berikutnya, dan kurung kurawal HARUS di baris berikutnya setelah badan. Jadi, saya juga punya beberapa masalah dengan PSR-2
Erutan409
Saya menemukan yang berikut ini tidak masuk akal. Kawat gigi pembuka untuk kelas HARUS di baris berikutnya, dan kawat gigi penutup HARUS di baris berikutnya setelah badan. Kurung buka untuk metode HARUS di baris berikutnya, dan kurung kurawal HARUS di baris berikutnya setelah badan. Jadi, saya juga punya beberapa masalah dengan PSR-2
phat_boi
BENAR. Namun, tidak masalah standar mana yang digunakan selama standar itu digunakan di seluruh organisasi. Anda tidak masuk ke perusahaan, dan mulai menggunakan PSR-2, ketika sudah ada standar yang ditetapkan. Anda berakhir dengan kekacauan seperti itu
phat_boi
BENAR. Namun, tidak masalah standar mana yang digunakan selama standar itu digunakan di seluruh organisasi. Anda tidak masuk ke perusahaan, dan mulai menggunakan PSR-2, ketika sudah ada standar yang ditetapkan. Anda berakhir dengan kekacauan seperti itu
Julian Chappel
+1. semua pembunuh, tidak ada pengisi
Julian Chappel
+1. semua pembunuh, tidak ada pengisi
Juukie14
👍 tips bagus
Juukie14
👍 tips bagus
Tidak ada Nama
> Kesalahan Umum #5 Itu bukanlah kesalahan yang sebenarnya. Pertimbangkan, jika kueri Anda telah menjalankan durasi 1 detik/kueri, jadi apa yang terjadi jika Anda membutuhkan 50-100 kueri seperti itu? . Tetapi Anda harus mengosongkan memori sumber daya setelah mendapatkan hasil kueri jika Anda memiliki sedikit lebih dari beberapa kueri sederhana. Dan tentang PSR-1 > Nama kelas HARUS dideklarasikan di StudlyCaps Ini adalah hal paling gila di PSR
Tidak ada Nama
> Kesalahan Umum #5 Itu bukanlah kesalahan yang sebenarnya. Pertimbangkan, jika kueri Anda telah menjalankan durasi 1 detik/kueri, jadi apa yang terjadi jika Anda membutuhkan 50-100 kueri seperti itu? . Tetapi Anda harus mengosongkan memori sumber daya setelah mendapatkan hasil kueri jika Anda memiliki sedikit lebih dari beberapa kueri sederhana. Dan tentang PSR-1 > Nama kelas HARUS dideklarasikan di StudlyCaps Ini adalah hal paling gila di PSR
Tidak ada Nama
> Kesalahan Umum #10. Anda tidak boleh menggunakan ArrayObject alih-alih array asli. Tetapi Anda harus menempatkan tipe dalam definisi saat Anda membutuhkan array sebagai argumen. Anda harus selalu tahu apa yang Anda harapkan agar tidak pernah mendapatkan kesalahan dalam contoh kosong/isset
Tidak ada Nama
> Kesalahan Umum #10. Anda tidak boleh menggunakan ArrayObject alih-alih array asli. Tetapi Anda harus menempatkan tipe dalam definisi saat Anda membutuhkan array sebagai argumen. Anda harus selalu tahu apa yang Anda harapkan agar tidak pernah mendapatkan kesalahan dalam contoh kosong/isset
Mengatasi Idemudia
Bagian yang bagus, terima kasih
Mengatasi Idemudia
Bagian yang bagus, terima kasih
Eric Belusic
solusi yang baik untuk kesalahan #1 daripada mengingat untuk memanggil unset() adalah dengan menggunakan array_map()
Eric Belusic
solusi yang baik untuk kesalahan #1 daripada mengingat untuk memanggil unset() adalah dengan menggunakan array_map()
Evgeny Chernyavskiy
serta array_walk()
Evgeny Chernyavskiy
serta array_walk()
timw4mail
Namun postingan itu memiliki ketidakakuratan pada saat itu, dan kurang relevan dari sebelumnya. Saya tidak akan mengatakan bahwa PHP adalah bahasa 'murni' atau 'bersih', tetapi umumnya tidak rawan kesalahan seperti yang terlihat pada 'artikel' itu
timw4mail
Namun postingan itu memiliki ketidakakuratan pada saat itu, dan kurang relevan dari sebelumnya. Saya tidak akan mengatakan bahwa PHP adalah bahasa 'murni' atau 'bersih', tetapi umumnya tidak rawan kesalahan seperti yang terlihat pada 'artikel' itu
Ricardo Sánchez
Kenapa tidak saja. $array?. ) Kita tahu bahwa variabel selalu disetel, selalu. Mengapa Anda mencoba menggunakan variabel yang mungkin tidak ada? . Variabel harus selalu ada. ditambah isset dan kosong mengarah ke toleransi kesalahan ketik dalam skrip. $Varku = 0; . Biarkan kompiler mengeluh alih-alih membungkamnya dengan @/isset/kosong. PSR dimaksudkan hanya untuk penggunaan internal. Ini TIDAK PERNAH ditujukan untuk digunakan untuk orang lain. seperti yang mereka katakan di FAQ. "Tidak seorang pun di grup ingin memberi tahu Anda, sebagai seorang programmer, bagaimana membangun aplikasi Anda. " Jadi itu adalah kesalahan umum programmer php, mengikuti rekomendasi yang tidak ditujukan untuk mereka. )
Ricardo Sánchez
Kenapa tidak saja. $array?. ) Kita tahu bahwa variabel selalu disetel, selalu. Mengapa Anda mencoba menggunakan variabel yang mungkin tidak ada? . Variabel harus selalu ada. ditambah isset dan kosong mengarah ke toleransi kesalahan ketik dalam skrip. $Varku = 0; . Biarkan kompiler mengeluh alih-alih membungkamnya dengan @/isset/kosong. PSR dimaksudkan hanya untuk penggunaan internal. Ini TIDAK PERNAH ditujukan untuk digunakan untuk orang lain. seperti yang mereka katakan di FAQ. "Tidak seorang pun di grup ingin memberi tahu Anda, sebagai seorang programmer, bagaimana membangun aplikasi Anda. " Jadi itu adalah kesalahan umum programmer php, mengikuti rekomendasi yang tidak ditujukan untuk mereka. )
Marco Cante
Untuk 2. get_defined_vars dengan array_key_exist sangat lambat jika Anda mengatur banyak variabel, bukan?
Marco Cante
Untuk 2. get_defined_vars dengan array_key_exist sangat lambat jika Anda mengatur banyak variabel, bukan?
Austerus
itu masalah opini dan standar ditentukan oleh praktik mayoritas. Mengapa itu tidak masuk akal? . Definisi kelas dan definisi metode bisa panjang (kadang-kadang log tidak masuk akal) sehingga kurung buka bisa waaaaaay ke kanan. Memilikinya secara otomatis jatuh ke baris berikutnya menghemat keterbacaan dan itu hanyalah satu aturan untuk membantu mengurangi polusi
Austerus
itu masalah opini dan standar ditentukan oleh praktik mayoritas. Mengapa itu tidak masuk akal? . Definisi kelas dan definisi metode bisa panjang (kadang-kadang log tidak masuk akal) sehingga kurung buka bisa waaaaaay ke kanan. Memilikinya secara otomatis jatuh ke baris berikutnya menghemat keterbacaan dan itu hanyalah satu aturan untuk membantu mengurangi polusi
Austerus
1. Ekstensi mysql yang disebutkan sudah tidak digunakan lagi bahkan pada saat artikel dibuat. Itu masalah yang bahkan saat itu tidak memerlukan solusi kode. 2. Serius, penulis menawarkan solusi sebuah praktik yang sengaja dihapus dari inti php (dikembalikan dengan referensi) yang disarankan oleh semua panduan praktik terbaik (kecuali memiliki alasan yang sangat bagus) hanya karena alasan mengizinkan perubahan pada anggota kelas PRIVATE . mengapa mempromosikan pengembalian dengan referensi?
Austerus
1. Ekstensi mysql yang disebutkan sudah tidak digunakan lagi bahkan pada saat artikel dibuat. Itu masalah yang bahkan saat itu tidak memerlukan solusi kode. 2. Serius, penulis menawarkan solusi sebuah praktik yang sengaja dihapus dari inti php (dikembalikan dengan referensi) yang disarankan oleh semua panduan praktik terbaik (kecuali memiliki alasan yang sangat bagus) hanya karena alasan mengizinkan perubahan pada anggota kelas PRIVATE . mengapa mempromosikan pengembalian dengan referensi?
govindrajput
Artikel bagus dan informasi yang sangat bagus didapat di postingan ini jadi saya suka postingannya terima kasih
govindrajput
Artikel bagus dan informasi yang sangat bagus didapat di postingan ini jadi saya suka postingannya terima kasih
PERUSAHAAN KEUANGAN BINTANG LIMA
Apakah Anda Membutuhkan Pinjaman Untuk Mengkonsolidasikan Utang Anda Pada 3%? . Kami Menawarkan Konsultasi Keuangan Kepada Klien, Perusahaan Yang Mencari Pembiayaan Hutang / Pinjaman Dan Mencari Modal Kerja Untuk Memulai Bisnis Baru Atau Untuk Memperluas Bisnis Yang Sudah Ada. Perantara/Konsultan/Broker Dipersilakan Membawa Kliennya Dan Terlindungi 100%. Pihak Yang Tertarik Harus Menghubungi Kami Untuk Informasi Lebih Lanjut Melalui Via E-mail. fivestarfinancecompany@gmail. com Untuk telepon atau whatsapp kami +16042659337
PERUSAHAAN KEUANGAN BINTANG LIMA
Apakah Anda Membutuhkan Pinjaman Untuk Mengkonsolidasikan Utang Anda Pada 3%? . Kami Menawarkan Konsultasi Keuangan Kepada Klien, Perusahaan Yang Mencari Pembiayaan Hutang / Pinjaman Dan Mencari Modal Kerja Untuk Memulai Bisnis Baru Atau Untuk Memperluas Bisnis Yang Sudah Ada. Perantara/Konsultan/Broker Dipersilakan Membawa Kliennya Dan Terlindungi 100%. Pihak Yang Tertarik Harus Menghubungi Kami Untuk Informasi Lebih Lanjut Melalui Via E-mail. fivestarfinancecompany@gmail. com Untuk telepon atau whatsapp kami +16042659337
Poin Lezat
Heyas, I may be 4 or 5 years to late for a response, but no one seems to know the right answer to this one. If I create a php index file with html tags neatly laid out which is worse: A) Having a bunch of php code on top of the index php file and some in the middle for example "