2015 оны 8 сарын 11

PHP дээр санаандгүй алдаанд хүргэх тохиолдлууд

PHP хэлний функийн уг алгоритм зэрэгтэй холбогдон гардаг анхаарууштай алдаануудаас

PHP хэл дээр код бичиж байхад тохиолдсон эсвэл гаргах магадлалтай "алдаа"-нуудаас сийрүүлэн тэмдэглэж байхаар шийдлээ. Тухайн функц ба оператораа бүрэн судлаагүй, судалсан ч гарын авлага дээр нь дурдагдаагүй зүйлсээс болж маш сонин хачин алдаанууд гарах нь түгээмэл байдаг.

1. str_replace

$input = 'ST1 AND ST2';
echo str_replace(array('AND', 'OR'), 'LOGICAL_OPERATOR', $input);

Эргээд бодоход мэдээжийн алдаа. Гэвч анх бичихдээ анхаарсангүй. Хэргийн эзэн нь OPERATOR-ын төгсгөлийн OR юм. Үүнээс болж үр дүн нь "ST1 LOGICAL_OPERATLOGICAL_OPERATOR ST2" гэж хэвлэгдэнэ.

2. reference-ийг салгалгүй орхих

Мэддэг ч гэлээ гаргаж мэдэх нэг алдааг одоо дурдъя.

$arr = [1,2];
foreach($arr as &$val){
  $val = $val * 2;
}
// unset($val);
$val = 0;
print_r($arr);

/* Үр дүн
Array
(
    [0] => 2
    [1] => 0
)
*/

Мэдээж unset() функцийн өмнөх комментийг авч хаяхад зөв ажиллана. Эргүүлж буцаах боломжгүй байдалд аваачиж чадах ноцтой алдаануудын нэг юм.

3. Төрөл холих

Ийм төрлийн алдаа гаргасан үед ихэвчлэн гэнэтийн бэлэг хүлээн авдаг.

echo var_dump(0 == ''); // буруу
echo var_dump(0 === ''); // зөв

String төрлийг тоон төрөлд хувиргахдаа '' буюу хоосон string-ийг 0 буюу тэг болгож авдаг явдал. Иймд хувьсагчийн төрлийг сайн анхаарах шаардлагатай.