Apakah penggabungan variabel php memengaruhi kinerja?

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

Show

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,2

Tidak, 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";
_0

Apa 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";
_1

Satu 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";
_2

Kode 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";
_3

Output 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";
_4

Jika 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";
_5

Pendekatan 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";
_6

Meskipun 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";
_7

Akibatnya, 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";
_8

Tetapi 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";
_9

Oleh 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
0

Oke, sekarang mari kita periksa penggunaan sumber daya

1,2,3
1,2,3
1,2,2
1

Keluaran

1,2,3
1,2,3
1,2,2
2

Keren. 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
3

Apa 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
4

Dan 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
5

Ketika 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
7

Anehnya, hasilnya akan seperti itu

1,2,3
1,2,3
1,2,2
8

Mengapa?

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
_9

Kemudian 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

$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
unset($value);   // $value no longer references $arr[3]
0

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]
1

Jika 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]
2

Namun 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]
3

Itu 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]
4

Oleh 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]
5

Atau sebagai alternatif

$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
unset($value);   // $value no longer references $arr[3]
6

Kesalahan 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]
7

Dan 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]
8

Pendekatan 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]
_9

Dan 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
}
0

Kemudian 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
}
_1

Oke, 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
}
_2

Baik 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
}
_3

Aduh. 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
}
_4

Jadi 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

PHP

Freelancer? 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 "" <--- alot of these or B) index php file with all the html tags neatly, and 1 or 2 include(""); ? I'm assuming A) is worse but why am I doing B) and avoiding A)? Thanks in advance! bah, it wont let me type the php carot and question mark and then php it omits it but its supposed to go where it looks janky

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 "" <--- alot of these or B) index php file with all the html tags neatly, and 1 or 2 include(""); ? I'm assuming A) is worse but why am I doing B) and avoiding A)? Thanks in advance! bah, it wont let me type the php carot and question mark and then php it omits it but its supposed to go where it looks janky

discreetsoft

good awesome information, thanks yaser Discreet Soft

AbelardoLG

Artikel bagus. Terima kasih telah membawanya kepada kami. . ) Sdr

JorgeC

PHP, termasuk PHP +7 dengan opcache cukup efisien. Namun, PHP secara umum sangat buruk dalam menangani memori, biasanya digunakan dari x2. 5 (rata-rata) untuk setiap memori yang digunakan. Jadi, jika kita memiliki array dengan 100 elemen (100kb), PHP menggunakan 250kb, ditambah indeksnya. get_defined_vars() bisa menjadi babi memori karena kami membuat array baru dengan semua variabel, bahkan jika hidup ini singkat

Bill Jay

Artikel bagus. Namun 10 kesalahan ini tidak umum. Ini adalah 10 kelemahan pengkodean yang sulit dideteksi oleh pengembang PHP. Secara pribadi, isset() biasanya agak membingungkan. Aturannya adalah hindari menyetel variabel ke null di PHP karena ini sama dengan membatalkan setelannya. batalkan($a); . $item = larik();

Apa cara yang efisien untuk menggabungkan dua variabel dalam PHP?

Istilah concatenate dalam PHP mengacu pada penggabungan beberapa string menjadi satu string; . Dalam PHP, penggabungan dilakukan dengan menggunakan operator penggabungan (". ") yang berupa titik .

Apakah rangkaian string lambat?

Setiap kali strcat memanggil, perulangan akan berjalan dari awal sampai akhir; . Sampai string ekstensif, penambahan string berlangsung sangat berat dan lambat .

Mengapa kami menggunakan concatenate di PHP?

Operator penggabungan PHP (. ) digunakan untuk menggabungkan dua nilai string menjadi satu string .

Apa hasil penggabungan string dengan tipe data lain di PHP?

Sebuah string dan nilai bilangan bulat ditambahkan, dan hasilnya adalah nilai bilangan bulat . Operator penggabungan ('.