Zgodność z EKG: jak to zrobić?

10

Jest coś takiego jak coding standarddla Magento 1 , nazywanego ECGtam , gdzie należy unikać wielu rzeczy lub metod, których nie należy stosować.

Spróbujmy utworzyć listę, która obejmie wszystkie przypadki, które zgłaszają „błędy” lub „ostrzeżenia” w kodzie.

Poniżej znajduje się lista wszystkich możliwych ostrzeżeń. Będę aktualizować ten post w regularnych odstępach czasu i link do podanych i pozytywnych odpowiedzi.

Uwaga: staraj się unikać duplikatów odpowiedzi;)

Pobierz: https://github.com/magento-ecg/coding-standard


EKG wącha

Klasy

MySQL4

Klasy Mysql4 są przestarzałe.

Tworzenie instancji obiektu

Bezpośrednie tworzenie instancji obiektów (klasa% s) jest odradzane w Magento.

protected $disallowedClassPrefixes = array(
    'Mage_',
    'Enterprise_',
);

...

PHP

Iść do

Używanie goto jest odradzane.

...

Przestrzeń nazw

Przestrzeń nazw dla klasy „”. $ WyjątekClassName. ”„ Nie jest określona.

...

Członek klasy prywatnej

Wykryto członka klasy prywatnej.

...

Var

Wykryto członka klasy prywatnej.

...

Wydajność

Liczba kolekcji

Niepotrzebne ładowanie zbioru danych Magento. Zamiast tego użyj metody getSize ().

FetchAll

Funkcja fetchAll () może być nieefektywna w przypadku dużych zestawów danych.

...

GetFirstItem

Funkcja getFirstItem () nie ogranicza wyniku ładowania kolekcji do jednego elementu.

Pętla

Wykryto w pętli funkcję obliczania rozmiaru tablicy% s

Modelowa metoda LSD% s wykryta w pętli

Metoda ładowania% s wykryta w pętli

protected $countFunctions = array(
    'sizeof',
    'count'
);
protected $modelLsdMethods = array(
    'load',
    'save',
    'delete'
);

Bezpieczeństwo

Acl

Brak metody% s () ACL w klasie% s.

const PARENT_CLASS_NAME = 'Mage_Adminhtml_Controller_Action';
const REQUIRED_ACL_METHOD_NAME = '_isAllowed';

...

Zniechęcona funkcja

public $forbiddenFunctions = array(
    '^is_dir' => null,
    '^is_file$' => null,
    '^pathinfo$' => null,
);

...

Zabroniona funkcja

public $forbiddenFunctions = array(
    '^assert$' => null,
    '^bind_textdomain_codeset$' => null,
    '^bindtextdomain$' => null,
    '^bz.*$' => null,
    '^call_user_func$' => null,
    '^call_user_func_array$' => null,
    '^chdir$' => null,
    '^chgrp$' => null,
    '^chmod$' => null,
    '^chown$' => null,
    '^chroot$' => null,
    '^com_load_typelib$' => null,
    '^copy$' => null,
    '^create_function$' => null,
    '^curl_.*$' => null,
    '^cyrus_connect$' => null,
    '^dba_.*$' => null,
    '^dbase_.*$' => null,
    '^dbx_.*$' => null,
    '^dcgettext$' => null,
    '^dcngettext$' => null,
    '^dgettext$' => null,
    '^dio_.*$' => null,
    '^dirname$' => null,
    '^dngettext$' => null,
    '^domxml_.*$' => null,
    '^exec$' => null,
    '^fbsql_.*$' => null,
    '^fdf_add_doc_javascript$' => null,
    '^fdf_open$' => null,
    '^fopen$' => null,
    '^fsockopen$' => null,
    '^ftp_.*$' => null,
    '^fwrite$' => null,
    '^gettext$' => null,
    '^gz.*$' => null,
    '^header$' => null,
    '^highlight_file$' => null,
    '^ibase_.*$' => null,
    '^id3_set_tag$' => null,
    '^ifx_.*$' => null,
    '^image.*$' => null,
    '^imap_.*$' => null,
    '^ingres_.*$' => null,
    '^ircg_.*$' => null,
    '^ldap_.*$' => null,
    '^link$' => null,
    '^mail$' => null,
    '^mb_send_mail$' => null,
    '^mkdir$' => null,
    '^move_uploaded_file$' => null,
    '^msession_.*$' => null,
    '^msg_send$' => null,
    '^msql$' => null,
    '^msql_.*$' => null,
    '^mssql_.*$' => null,
    '^mysql_.*$' => null,
    '^odbc_.*$' => null,
    '^opendir$' => null,
    '^openlog$' => null,
    '^ora_.*$' => null,
    '^ovrimos_.*$' => null,
    '^parse_ini_file$' => null,
    '^parse_str$' => null,
    '^parse_url$' => null,
    '^parsekit_compile_string$' => null,
    '^passthru$' => null,
    '^pcntl_.*$' => null,
    '^posix_.*$' => null,
    '^pfpro_.*$' => null,
    '^pfsockopen$' => null,
    '^pg_.*$' => null,
    '^php_check_syntax$' => null,
    '^popen$' => null,
    '^print_r$' => null,
    '^printf$' => null,
    '^proc_open$' => null,
    '^putenv$' => null,
    '^readfile$' => null,
    '^readgzfile$' => null,
    '^readline$' => null,
    '^readlink$' => null,
    '^register_shutdown_function$' => null,
    '^register_tick_function$' => null,
    '^rename$' => null,
    '^rmdir$' => null,
    '^scandir$' => null,
    '^session_.*$' => null,
    '^set_include_path$' => null,
    '^set_ini$' => null,
    '^set_time_limit$' => null,
    '^setcookie$' => null,
    '^setlocale$' => null,
    '^setrawcookie$' => null,
    '^shell_exec$' => null,
    '^sleep$' => null,
    '^socket_.*$' => null,
    '^stream_.*$' => null,
    '^sybase_.*$' => null,
    '^symlink$' => null,
    '^syslog$' => null,
    '^system$' => null,
    '^touch$' => null,
    '^trigger_error$' => null,
    '^unlink$' => null,
    '^vprintf$' => null,
    '^mysqli.*$' => null,
    '^oci_connect$' => null,
    '^oci_pconnect$' => null,
    '^quotemeta$' => null,
    '^sqlite_popen$' => null,
    '^time_nanosleep$' => null,
    '^base64_decode$' => null,
    '^base_convert$' => null,
    '^basename$' => null,
    '^chr$' => null,
    '^convert_cyr_string$' => null,
    '^dba_nextkey$' => null,
    '^dns_get_record$' => null,
    '^extract$' => null,
    '^fdf_.*$' => null,
    '^fget.*$' => null,
    '^fread$' => null,
    '^fflush$' => null,
    '^get_browser$' => null,
    '^get_headers$' => null,
    '^get_meta_tags$' => null,
    '^getallheaders$' => null,
    '^getenv$' => null,
    '^getopt$' => null,
    '^headers_list$' => null,
    '^hebrev$' => null,
    '^hebrevc$' => null,
    '^highlight_string$' => null,
    '^html_entity_decode$' => null,
    '^ibase_blob_import$' => null,
    '^id3_get_tag$' => null,
    '^import_request_variables$' => null,
    '^ircg_nickname_unescape$' => null,
    '^ldap_get_values$' => null,
    '^mb_decode_mimeheader$' => null,
    '^mb_parse_str$' => null,
    '^mcrypt_decrypt$' => null,
    '^mdecrypt_generic$' => null,
    '^msg_receive$' => null,
    '^ngettext$' => null,
    '^ob_get_contents$' => null,
    '^ob_get_flush$' => null,
    '^rawurldecode$' => null,
    '^shm_get_var$' => null,
    '^stripcslashes$' => null,
    '^stripslashes$' => null,
    '^token_get_all$' => null,
    '^unpack$' => null,
    '^convert_uudecode$' => null,
    '^iconv_mime_decode$' => null,
    '^iconv_mime_decode_headers$' => null,
    '^iconv_mime_encode$' => null,
    '^iconv_set_encoding$' => null,
    '^php_strip_whitespace$' => null,
    '^addcslashes$' => null,
    '^addslashes$' => null,
    '^escapeshellarg$' => null,
    '^escapeshellcmd$' => null,
    '^gettype$' => null,
    '^var_dump$' => null,
    '^tempnam$' => null,
    '^realpath$' => null,
    '^linkinfo$' => null,
    '^lstat$' => null,
    '^stat$' => null,
    '^lchgrp$' => null,
    '^lchown$' => null,
    '^show_source$' => null,
    '^is_executable$' => null,
    '^is_link$' => null,
    '^is_readable$' => null,
    '^is_writable$' => null,
    '^is_writeable$' => null,
    '^is_uploaded_file$' => null,
    '^glob$' => null,
    '^ssh2_.*$' => null,
    '^delete$' => null,
    '^file.*$' => null,
);

Dołącz plik

Wykryto instrukcję „% s”. Manipulowanie plikami jest odradzane.

... Instrukcja nie jest funkcją, nawiasy nie są wymagane.

... Przekazywanie adresów URL jest zabronione.

... Łączenie jest zabronione.

... Zmienne wewnątrz są niepewne.

public $urlPattern = '#(https?|ftp)://.*#i';

...

Konstrukcja językowa

Niepoprawne użycie stałej ciągu znaków cudzysłowu. Cudzysłowy powinny zawsze znajdować się w ciągach znaków.

Używanie konstrukcji języka% s jest odradzane.

    return array(
        T_EXIT,
        T_ECHO,
        T_PRINT,
        T_BACKTICK
    );

...

Superglobal

Wykryto bezpośrednie użycie% s Superglobal.

public $superGlobalErrors = array(
    '$GLOBALS',
    '$_GET',
    '$_POST',
    '$_SESSION',
    '$_REQUEST',
    '$_ENV'
);
public $superGlobalWarning = array(
    '$_FILES',
    '$_COOKIE',
    '$_SERVER',
);

Sql

Surowe zapytanie

Możliwe wykrycie surowej instrukcji SQL% s

public $statements = array(
    'SELECT',
    'UPDATE',
    'INSERT',
    'CREATE',
    'DELETE',
    'ALTER',
    'DROP'
);
public $queryFunctions = array(
    'query',
    'raw_query'
);

...

Wolne zapytanie

Wykryto możliwą powolną instrukcję SQL% s

Wykryto możliwą powolną metodę SQL% s

public $adapterMethods = array(
    'group',
    'having',
    'distinct',
    'addLikeEscape',
    'escapeLikeValue',
    'union',
    'orHaving',
);
public $rawStatements = array(
    'GROUP BY',
    'HAVING',
    'DISTINCT',
    'LIKE',
    'UNION',
);

...

Smyczki

RegEx

Możliwe wykonywalne wyrażenie regularne w% s. Upewnij się, że wzorzec nie zawiera modyfikatora „e”

public $functions = array(
    'preg_replace',
);

...

Concat String

Użycie operatora + do połączenia dwóch wykrytych ciągów

...

Pozycja ciągu

Identyczny operator === nie jest używany do testowania wartości zwracanej funkcji% s

public $functions = array(
    'strpos',
    'stripos',
);

Powiązane pytania i odpowiedzi dotyczące

sv3n
źródło
LOL o tym poście, napisałeś prawie dokument :)
PЯINCƏ
@Prince ktoś inny może trochę pomóc, aby to
zrobić
Nie sądzę :)
PЯINCƏ
jakaś alternatywa dla stripcslashes ()? @ sv3n dzięki za pytanie opisowe i odpowiedzi :)
Keyur Shah 30.01.2018
@KeyurShah Nie. Zignoruj ​​ostrzeżenie lub unikaj „przed” :) W jakim przypadku z niego korzystasz? Może dodać to jako pytanie?
sv3n

Odpowiedzi:

6

Zabroniona funkcja

plik istnieje()

Używanie funkcji file_exists () jest zabronione

błędny:

if (!file_exists($filePath)) {
    ...
}

poprawny:

$io = new Varien_Io_File();
if (!$io->fileExists($filePath)) {
    ...
}

lub

$validatorNot = new Zend_Validate_File_NotExists($path);
if ($validatorNot->isValid($file)) {
    ...
}
sv3n
źródło
5

GetFirstItem

Funkcja getFirstItem () nie ogranicza wyniku ładowania kolekcji do jednego elementu.

błędny:

$collection = Mage::getModel('catalog/category')
    ->load(41)
    ->getProductCollection()
    ->addAttributeToSelect('weight');

$product = $collection->getFirstItem();
$weight  = $product->getData('weight');

poprawny:

Zastosuj limit przed pobraniem danych.

$collection->getSelect()->limit(1)

lub

$collection->setPageSize(1, 1)

Przykłady:

Kolekcja z 750 produktami ...

Bez ograniczeń przed:

  • Razem Czas ścienny (mikrosekundy): 2 116 522 mikrosekund
  • Razem Procesor (mikrosekundy): 2 101 688 mikrosekund
  • Razem MemUse (bajty): 4,783,504 bajtów
  • Razem PeakMemUse (bytes): 4 363 112 bajtów
  • Liczba wywołań funkcji: 104 187

Przy użyciu getSelect()->limit(1):

  • Razem Czas ścienny (mikrosekund): 149 803 mikrosekund
  • Razem Procesor (mikrosekundy): 131 405 mikrosekund
  • Razem MemUse (bajty): 2 384 840 bajtów
  • Razem PeakMemUse (bytes): 1 827 112 bajtów
  • Liczba wywołań funkcji: 5,327

Z użyciem setPageSize(1, 1)

  • Razem Czas ścienny (mikrosekund): 155 025 mikrosekund
  • Razem Procesor (mikrosekundy): 136 191 mikrosekund
  • Razem MemUse (bajty): 2413128 bajtów
  • Razem PeakMemUse (bytes): 1 856 064 bajtów
  • Liczba wywołań funkcji: 5515

Uwaga:

To ostrzeżenie będzie nadal pojawiać się, nawet jeśli wcześniej ograniczysz swoją kolekcję. Aby pozbyć się tej wiadomości, użyj $collection->getLastItem()zamiast tego.

sv3n
źródło
Dostaję, Data access method LIMIT detected outside of Resource Modelgdy używam limitu`
Amit Patel
1
Oto więcej szczegółów
Amit Patel,
5

Zabroniona funkcja

curl_xyz

Używanie funkcji curl_init (), curl_setopt (), curl_exec (), curl_close () jest zabronione

błędny:

$ch = curl_init();
curl_setopt($connection, CURLOPT_HTTPHEADER, $header);
curl_setopt($connection, CURLOPT_POSTFIELDS, $request);
curl_setopt($connection, CURLOPT_URL, $url);
$response = curl_exec($ch);
curl_close($ch);

poprawny:

$options = array(
    CURLOPT_HTTPHEADER => $header,
    CURLOPT_POSTFIELDS => $request
);

$curl = new Varien_Http_Adapter_Curl();
$curl->setOptions($options);
$curl->write(Zend_Http_Client::GET, $url, Zend_Http_Client::HTTP_0);
$response = $curl->read();
$responseBody = Zend_Http_Response::extractBody($response);
$curl->close();
sv3n
źródło
Użyłem powyższego kodu i daje mi to błąd Uncaught Error: Class 'Custom\Rma\Helper\Varien_Http_Adapter_Curl' not found. Jak korzystać z klasy, znalazłem ją u sprzedawcy, ale bez powodzenia.
Nitin Pawar
@NitinPawar czy możesz otworzyć nowe pytanie? Coś jest nie tak z twoim kodem.
sv3n