การปฏิบัติตาม ECG: จะทำอย่างไร?


10

มีบางอย่างเช่นcoding standardสำหรับMagento 1 ที่เรียกว่าECGควรหลีกเลี่ยงสิ่งต่าง ๆ มากมายหรือวิธีการที่ไม่ควรใช้

ลองสร้างรายการที่ครอบคลุมทุกกรณีที่มีการโยน "ข้อผิดพลาด" หรือ "คำเตือน" ในรหัสของคุณ

ด้านล่างคุณจะพบรายการพร้อมคำเตือนที่เป็นไปได้ทั้งหมด ฉันจะอัปเดตโพสต์นี้เป็นระยะและเชื่อมโยงไปยังคำตอบที่ได้รับและ upvoted

หมายเหตุ:โปรดพยายามหลีกเลี่ยงคำตอบที่ซ้ำกัน;)

ดาวน์โหลด: https://github.com/magento-ecg/coding-standard


คลื่นไฟฟ้าหัวใจ Sniffs

การเรียนการสอน

Mysql4

คลาส Mysql4 ล้าสมัยแล้ว

การเริ่มต้นวัตถุ

การทำให้อินสแตนซ์ของวัตถุโดยตรง (คลาส% s) ไม่ได้รับการสนับสนุนใน Magento

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

...

PHP

ไปที่

การใช้ goto นั้นไม่ได้รับการสนับสนุน

...

namespace

ไม่ได้ระบุ Namespace สำหรับ "'. $ exceptionClassName." "

...

สมาชิกคลาสส่วนตัว

ตรวจพบสมาชิกคลาสส่วนตัวแล้ว

...

var

ตรวจพบสมาชิกคลาสส่วนตัวแล้ว

...

ประสิทธิภาพ

การรวบรวมจำนวน

การโหลดชุดเก็บรวบรวมข้อมูลวีโอไอพีที่ไม่จำเป็น ใช้เมธอด getSize () แทน

FetchAll

fetchAll () อาจไม่มีประสิทธิภาพหน่วยความจำสำหรับชุดข้อมูลขนาดใหญ่

...

GetFirstItem

getFirstItem () ไม่ได้ จำกัด ผลลัพธ์ของการรวบรวมข้อมูลไว้ที่หนึ่งรายการ

ห่วง

ฟังก์ชันการคำนวณขนาดอาร์เรย์ตรวจพบ% s ในลูป

ตรวจพบเมธอด LSD รุ่น% s ในลูป

ตรวจพบวิธีการโหลดข้อมูล% s ในลูป

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

ความปลอดภัย

acl

ไม่มีวิธีการ% s () ACL ในคลาส% s

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

...

ฟังก์ชั่นท้อแท้

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

...

ฟังก์ชั่นต้องห้าม

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,
);

รวมไฟล์

ตรวจพบคำสั่ง "% s" การบิดเบือนไฟล์จะหมดกำลังใจ

... คำชี้แจงไม่ใช่ฟังก์ชั่นไม่จำเป็นต้องใช้วงเล็บ

... ห้ามส่ง URL

... ไม่อนุญาตให้ทำการเชื่อมต่อ

... ตัวแปรภายในไม่มั่นคง

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

...

การสร้างภาษา

การใช้สตริงคำพูดย้อนหลังไม่ถูกต้อง เครื่องหมายคำพูดย้อนกลับควรอยู่ภายในสตริงเสมอ

ไม่สนับสนุนการใช้การสร้างภาษา% s

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

...

superglobal

ตรวจพบการใช้งานโดยตรงของ% s Superglobal

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

sql

แบบสอบถามดิบ

ตรวจพบคำสั่ง SQL ดิบที่เป็นไปได้% s

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

...

ข้อความค้นหาช้า

ตรวจพบคำสั่ง SQL ที่ช้าเป็นไปได้% s

ตรวจพบเมธอด SQL ที่ช้าได้% s

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

...

เงื่อนไข

RegEx

นิพจน์ทั่วไปที่สามารถประมวลผลได้ที่เป็นไปได้ใน% s ตรวจสอบให้แน่ใจว่ารูปแบบไม่มีตัวปรับแต่ง "e"

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

...

String Concat

ใช้เครื่องหมาย + เพื่อต่อเชื่อมสองสายที่ตรวจพบ

...

ตำแหน่งสตริง

ตัวดำเนินการที่เหมือนกัน === ไม่ได้ใช้สำหรับทดสอบค่าส่งคืนของฟังก์ชั่น% s

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

คำถามและคำตอบที่เกี่ยวข้องเพื่อ


ฮ่า ๆ เกี่ยวกับโพสต์นี้คุณเขียนเอกสารมาเกือบ :)
PЯINCƏ

@ ปรินซ์คนอื่นจะช่วยสักหน่อยในการทำให้สิ่งนี้เสร็จสมบูรณ์: P
sv3n

ผมไม่คิดอย่างนั้น :)
PЯINCƏ

ทางเลือกอื่นสำหรับ stripcslashes ()? @ ขอบคุณสำหรับคำถาม sv3n คำอธิบายดังกล่าวและคำตอบ :)
Keyur ชาห์

@KeyurShah ไม่สนใจคำเตือนหรือพยายามหลีกเลี่ยง "before" :) ในกรณีที่คุณใช้มัน? อาจเพิ่มเป็นคำถามหรือไม่
sv3n

คำตอบ:


6

ฟังก์ชั่นต้องห้าม

แฟ้มที่มีอยู่()

ห้ามใช้ function file_exists ()

ที่ไม่ถูกต้อง:

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

แก้ไข:

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

หรือ

$validatorNot = new Zend_Validate_File_NotExists($path);
if ($validatorNot->isValid($file)) {
    ...
}

5

GetFirstItem

getFirstItem () ไม่ได้ จำกัด ผลลัพธ์ของการรวบรวมข้อมูลไว้ที่หนึ่งรายการ

ที่ไม่ถูกต้อง:

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

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

แก้ไข:

ใช้ขีด จำกัด ก่อนคว้าข้อมูล

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

หรือ

$collection->setPageSize(1, 1)

Expamples:

คอลเลคชั่น 750 ผลิตภัณฑ์ ...

โดยไม่ จำกัด ก่อน:

  • รวม กำแพงเวลา (ไมโคร): 2,116,522 ไมโครวินาที
  • รวม CPU (microsecs): 2,101,688 microsecs
  • รวม MemUse (ไบต์): 4,783,504 ไบต์
  • รวม PeakMemUse (ไบต์): 4,363,112 ไบต์
  • จำนวนการเรียกใช้ฟังก์ชัน: 104,187

ด้วยการใช้getSelect()->limit(1):

  • รวม เวลากำแพง (ไมโคร): 149,803 ไมโครวินาที
  • รวม CPU (ไมโครไซต์): 131,405 microsecs
  • รวม MemUse (ไบต์): 2,384,840 ไบต์
  • รวม PeakMemUse (ไบต์): 1,827,112 ไบต์
  • จำนวนการเรียกใช้ฟังก์ชัน: 5,327

ด้วยการใช้ setPageSize(1, 1)

  • รวม เวลากำแพง (ไมโคร): 155,025 ไมโครเซส
  • รวม CPU (ไมโครไซต์): 136,191 microsecs
  • รวม MemUse (ไบต์): 2,413,128 ไบต์
  • รวม PeakMemUse (ไบต์): 1,856,064 ไบต์
  • จำนวนการเรียกใช้ฟังก์ชัน: 5,515

บันทึก:

คำเตือนนี้จะยังคงปรากฏขึ้นแม้ว่าคุณจะ จำกัด การสะสมก่อนหน้านี้ เพื่อกำจัดข้อความนี้ใช้$collection->getLastItem()แทน


ฉันจะได้รับ Data access method LIMIT detected outside of Resource Modelเมื่อใช้วงเงิน '
Amit Patel

1
นี่คือรายละเอียดเพิ่มเติม
Amit Patel

5

ฟังก์ชั่นต้องห้าม

curl_xyz

ห้ามใช้ฟังก์ชั่น curl_init (), curl_setopt (), curl_exec (), curl_close ()

ที่ไม่ถูกต้อง:

$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);

แก้ไข:

$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();

Uncaught Error: Class 'Custom\Rma\Helper\Varien_Http_Adapter_Curl' not foundฉันใช้รหัสข้างต้นและมันก็เป็นข้อผิดพลาดให้ฉัน วิธีใช้คลาสฉันพบในผู้จำหน่าย แต่ไม่มีโชค
Nitin Pawar

@NitinPawar คุณช่วยเปิดคำถามใหม่ได้ไหม? มีบางอย่างผิดพลาดกับรหัสของคุณ
sv3n
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.