Code review checklista

Praca z tablicami

  • jeżeli ktoś używa tablicy w PHP zwróć uwagę na odczyt danych po konkretnym kluczu

    <?php
    $a = [];
    echo $a['zlyKlucz']; // błąd
    

    powinno być

    <?php
    // PHP >= 7.0
    echo $a['zlyKlucz'] ?? 'domyślna wartość';
    // PHP < 7.0
    $username = isset($a['zlyKlucz']) ? $a['zlyKlucz'] : 'domyślna wartość';
    

Baza danych / migracje

  • warunek LIKE vs =

    W przypadku wyszukiwania watości w kolumnach typu CHAR lub VARCHAR i użycia operatora = istnieje niewielka poprawa wydajnościowa (odczuwalna tylko wtedy jak ktoś skopie całe zapytanie i napisze je mega nie optymalnie). Jednak główna różnica między tymi operatorami jest taka, że LIKE sprawdza wartości znak po znaku i nie ignoruje białych znaków na końcu wartości np:

    CREATE TABLE `test` (`string` VARCHAR(10));
    
    INSERT INTO `test` VALUE ('test');
    INSERT INTO `test` VALUE ('test ');
    INSERT INTO `test` VALUE ('test  ');
    INSERT INTO `test` VALUE ('test   ');
    INSERT INTO `test` VALUE ('nietest');
    
    SELECT COUNT(*) FROM `test` WHERE `string` LIKE 'test';
    # output: 1
    
    SELECT COUNT(*) FROM `test` WHERE `string` = 'test';
    # output: 4
    
  • korzystanie z WHERE Column IN (....)

    Tablea:

    ID Code
    1 dealer
    2 komis
    3 inny

    WHERE Code IN ('komis' 'inny', 'dealer') zwróci:

    ID Code
    1 dealer

    WHERE Code IN ('kom' 'is', 'dealer')

    ID Code
    1 dealer
    2 komis

    W PRZYPADKU BRAKU PRZECINKA WYSTEPUJE AUTOMATYCZNA KONKATENACJA !

  • upewnij się czy tworzona baza/tabela/kolumna przyjmuje polskie znaki przykładowa zmiana dla kolumny (mechanizm migracji)

    <?php
    $this->alterColumn(
        'dictionary_agreement',
        'TextBody',
        $this->text()->append('CHARACTER SET utf8 COLLATE utf8_unicode_ci')
        );
    

Aktywne rekordy

  • jeżeli edytowane są atrybuty rekordu aktywnego lub ktoś edytuje dane z użyciem rekordu aktywnego sprawdź czy atrybuty pokrywają się z polami w tabeli

  • Nie korzystać z 'magic numbers'.

    <?php
    $project->statusID = 1;
    

    powinno być coś w stylu:

    <?php
    $statusNew = Status::find()->where("CODE = 'NEW'");
    if ($statusNew instanceof Status) {
        $project->StatusID = $statusNew->ID;
    } // plus logika co jak ten kod jednak nie istnieje
    

Instrukcje warunkowe

  • sprawdzanie typowania przy warunkach if jeżeli $x='2' a warunek to $x==2 lepiej zrobić

    <?php
    2===(int)$x
    

    Po pierwsze sami rzutujemy $x na int po drugie warunek uwzlgędnia teraz typ po trzecie z $x==2 ktoś może przez przypadek zrobić $x=3 php z if na to pozwolą a w razie czego 3=$x dało by błąd

Framework

  • Nie korzystać z superglobalnych, zamiast

    <?php
    $_GET['ID'];
    

    powinno być:

    <?php
    Yii::$app->getRequest()->get('ID', 'domyślna wartość'); // chodź najlepiej gdyby do klasy aplikacji nie odwoływać się statycznie, ale to nie ten case ;)
    
Edit on GitLab