Причуды PHP и ловушки [закрываются]

После некоторого исследования я думаю, что пойду с Модификация ISO 7064 97,10 формула. Это кажется довольно твердым, поскольку это используется для проверки IBAN (Международный Номер банковского счета).

формула очень проста:

  1. Берут число: 123456
  2. Применяют следующую формулу для получения этих 2 контрольных сумм цифр: mod(98 - mod(number * 100, 97), 97) => 76
  3. номер Concat и контрольная сумма для получения кода => 12345676
  4. Для проверки кода проверьте что mod(code, 97) == 1

Тест:

  • mod(12345676, 97) = 1 => ХОРОШИЙ
  • mod(21345676, 97) = 50 => ПЛОХО!
  • mod(12345678, 97) = 10 => ПЛОХО!

, По-видимому, этот алгоритм фиксирует большинство ошибок.

Другая интересная опция была алгоритм Verhoeff . Это имеет только одну цифру проверки и более трудно реализовать (по сравнению с простой формулой выше).

14
задан 3 revs, 2 users 100% 6 April 2012 в 17:59
поделиться

13 ответов

Целочисленный размер зависит от платформы. Обычно вы не можете использовать 64-битные целые числа на 32-битной машине без внешнего модуля. Кроме того, нельзя объявлять целые числа без знака.

7
ответ дан 1 December 2019 в 05:58
поделиться

Ненавижу, как могут возникнуть проблемы, если вы закрываете php-файлы с помощью закрывающего тега ?> (кажется, что должно быть наоборот). Например, включите файл с некоторыми пробелами после?>, А затем попробуйте изменить заголовки (при условии отсутствия буферизации вывода). УГХ. Мне потребовалось много времени, чтобы научиться никогда не закрывать файлы php с помощью ?>

9
ответ дан 1 December 2019 в 05:58
поделиться

Приоритет оператора, не являющийся отраслевым стандартом.

$x = 1;
echo 'foo: ' . $x+1 . ' bar';

Будет выводить: « 1 бар » вместо ожидаемого « foo: 2 bar ". Решение: используйте круглые скобки.

8
ответ дан 1 December 2019 в 05:58
поделиться

Сериализация объектов, которые обрабатывают структуры XML, а затем их десериализация не восстанавливает исходную структуру XML:

$dom = new DOMDocument;
$dom->loadXML('<test/>');

$dom = serialize($dom);
$dom = unserialize($dom);

var_dump($dom->saveXML());
// $ Warning: DOMDocument::saveXML(): Couldn't fetch DOMDocument in ...
// $ NULL

Аналогично для Объекты SimpleXML.

10
ответ дан 1 December 2019 в 05:58
поделиться

Некоторые недавно представленные функции PHP не работают, потому что нет гарантии, что они будут поддерживаться по умолчанию в средах хостинга.

Больше всего меня раздражает настройка short_tags что включает и синтаксис тегов. Я утверждаю, что PHP должен был включить эту функцию по умолчанию, а не включать ее.

== EDIT ==

В PHP> = 5.4 параметр short_tags больше не учитывается для сокращенное выражение echo, как таковое, будет доступно в любой среде хостинга, которая поддерживает PHP 5.4 и выше.

2
ответ дан 1 December 2019 в 05:58
поделиться

Хотя строки могут повторяться с использованием для циклов и индексов, они не может быть повторен с использованием циклов foreach . Пример:

$str = 'foo';
$max = strlen($str);

for ($i=0; $i<$max; $i++)  {
    echo $str[$i];
}
// outputs: foo

foreach ($str as $char) {
    echo $char;
}
// Warning: Invalid argument supplied for foreach() ...
1
ответ дан 1 December 2019 в 05:58
поделиться

мой любимый:

<?php
$a = 0;
$b = 'x';
var_dump(FALSE == $a);
var_dump($a == $b);
var_dump($b == TRUE);

echo' <br />Conclusion: TRUE equals FALSE (at least in PHP)';
1
ответ дан 1 December 2019 в 05:58
поделиться

I've had all sorts of bother combining foreach with references

$testarray = array(1 => "one", 2 => "two");
$item = "three";
$testarray[3] =& $item;
foreach ($testarray as $key => $item) {
  // do nothing
}
echo $testarray[3]; // outputs "two"

This really threw me off during the PHP4 era, and although it's gotten better in PHP5 by having sane behavior if you don't use explicit references, I still manage to get caught by this one now and then.

6
ответ дан 1 December 2019 в 05:58
поделиться

Multiple ways of doing truth tests (not operator, empty(), is_null(), isset()) + weak typing = this

With some discipline you can mostly avoid the need to refer to this table:

  • For general truth tests, you can use boolean comparison if ($) { ... } if (!$x) { ... }. It behaves the way boolean operators in most languages do.

  • Always use empty() if you want to test form input for falsy values (it treats "0" as false).

  • Always use isset() if you want to determine whethere a variable is set or not

  • Use is_null() or $x === NULL if you only need to check for NULL

7
ответ дан 1 December 2019 в 05:58
поделиться

Функции работают по-разному в разных ОС, а некоторые функции доступны только в определенных ОС.

Для Например, функция mail () в Windows не может принимать имя отправителя в параметре от $ до . Он может содержать только адрес электронной почты. В Linux все работает нормально.

Другой пример, функция strptime () доступна только в Linux, но не в Windows (это привело меня к существующему проекту, который я хотел запустить на своем компьютере с Windows).

Конечно, есть некоторые функции, которые имеют смысл только в определенных ОС.

2
ответ дан 1 December 2019 в 05:58
поделиться

Несогласованные соглашения об именах встроенных функций. Например, этот набор функций обработки строк:

 str_shuffle()
 str_split()
 str_word_count()
 strcasecmp()
 strchr()
 strcmp()

Решение: Всегда оставляйте руководство открытым.

4
ответ дан 1 December 2019 в 05:58
поделиться

== EDIT == Это больше не верно для PHP> = 5.5!

Иногда я сталкиваюсь с фатальной ошибкой : невозможно использовать функцию. возвращаемое значение в контексте записи ошибка при использовании empty () построить. Например:

 if (! Empty (trim ($ _ GET ['s']))) {
 // ...
}

empty () нужна переменная, все остальное приведет к ошибке.

Решение:

 $ s = trim ($ _ GET ['s']);
if (! empty ($ s)) {
 // ...
}
1
ответ дан 1 December 2019 в 05:58
поделиться
$x = "a string";

if ($x == 142)
{
    echo "lol, of course $x is a number";
}
else
{
    echo "$x is clearly not equal to 142";
}

При запуске:

lol, of course a string is a number

Вы должны использовать ===

$x = "a string";

if ($x === 142)
{
    echo "lol, of course $x is a number";
}
else
{
    echo "$x is clearly not equal to 142";
}

При запуске:

a string is clearly not equal to 142
0
ответ дан 1 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: