После некоторого исследования я думаю, что пойду с Модификация ISO 7064 97,10 формула. Это кажется довольно твердым, поскольку это используется для проверки IBAN (Международный Номер банковского счета).
формула очень проста:
123456
mod(98 - mod(number * 100, 97), 97)
=> 76 mod(code, 97) == 1
Тест:
mod(12345676, 97) = 1
=> ХОРОШИЙ mod(21345676, 97) = 50
=> ПЛОХО! mod(12345678, 97) = 10
=> ПЛОХО! , По-видимому, этот алгоритм фиксирует большинство ошибок.
Другая интересная опция была алгоритм Verhoeff . Это имеет только одну цифру проверки и более трудно реализовать (по сравнению с простой формулой выше).
Целочисленный размер зависит от платформы. Обычно вы не можете использовать 64-битные целые числа на 32-битной машине без внешнего модуля. Кроме того, нельзя объявлять целые числа без знака.
Ненавижу, как могут возникнуть проблемы, если вы закрываете php-файлы с помощью закрывающего тега ?>
(кажется, что должно быть наоборот). Например, включите файл с некоторыми пробелами после?>, А затем попробуйте изменить заголовки (при условии отсутствия буферизации вывода). УГХ. Мне потребовалось много времени, чтобы научиться никогда не закрывать файлы php с помощью ?>
Приоритет оператора, не являющийся отраслевым стандартом.
$x = 1;
echo 'foo: ' . $x+1 . ' bar';
Будет выводить: « 1 бар
» вместо ожидаемого « foo: 2 bar
". Решение: используйте круглые скобки.
Сериализация объектов, которые обрабатывают структуры 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.
Некоторые недавно представленные функции PHP не работают, потому что нет гарантии, что они будут поддерживаться по умолчанию в средах хостинга.
Больше всего меня раздражает настройка short_tags
что включает foobar (); ?>
и синтаксис тегов. Я утверждаю, что PHP должен был включить эту функцию по умолчанию, а не включать ее. = $ Var?>
== EDIT ==
В PHP> = 5.4 параметр short_tags
больше не учитывается для сокращенное выражение echo, как таковое, будет доступно в любой среде хостинга, которая поддерживает PHP 5.4 и выше.
Хотя строки могут повторяться с использованием для
циклов и индексов, они не может быть повторен с использованием циклов 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() ...
мой любимый:
<?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)';
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.
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
Функции работают по-разному в разных ОС, а некоторые функции доступны только в определенных ОС.
Для Например, функция mail ()
в Windows не может принимать имя отправителя в параметре от $ до
. Он может содержать только адрес электронной почты. В Linux все работает нормально.
Другой пример, функция strptime ()
доступна только в Linux, но не в Windows (это привело меня к существующему проекту, который я хотел запустить на своем компьютере с Windows).
Конечно, есть некоторые функции, которые имеют смысл только в определенных ОС.
Несогласованные соглашения об именах встроенных функций. Например, этот набор функций обработки строк:
str_shuffle()
str_split()
str_word_count()
strcasecmp()
strchr()
strcmp()
Решение: Всегда оставляйте руководство открытым.
== EDIT == Это больше не верно для PHP> = 5.5!
Иногда я сталкиваюсь с фатальной ошибкой
: невозможно использовать функцию. возвращаемое значение в контексте записи
ошибка при использованииempty ()
построить. Например:if (! Empty (trim ($ _ GET ['s']))) { // ... }
empty ()
нужна переменная, все остальное приведет к ошибке.Решение:
$ s = trim ($ _ GET ['s']); if (! empty ($ s)) { // ... }
$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