Seky a skřeky

Seky a skřeky je příznačný název pro to co jsem nevěděl, nečekal a dalo mi to zabrat. Jsou zde takové, kterým se dá vyhnout (stačí vědět tu správnou věc ve správný čas), ale i a takové, které dělají problémy častěji. Dokonalé věci ani mozky neexistují, proto se tato stránka bude neustále rozrůstat.

Contents

[edit] PHP

[edit] volání metody

$record_set->MoveNext;     # přístup k atributu, který neexistuje
$record_set->MoveNext();   # správné volání metody

Ponaučení: Za voláním metody mají být kulaté závorky. Bez nich většinou vytvoříte nekonečný cyklus. Při E_NOTICE se zobrazí alespoň upozornění 'Undefined property'.

[edit] rovná se vs. ekvivalentní

$str = 0;
if ( $str == 'a' ) { echo "rovnaji se\n"; } else { echo "nerovnají se\n"; }
if ( $str === 'a' ) { echo "rovnaji se\n"; } else { echo "nerovnají se\n"; }

Vypíše 'rovnají se' a 'nerovnají se'. $str je číslo, proto se i 'a' převede na číslo a ty se porovnají.

$str = 10;
if ( $str == '10a' ) { echo "rovnaji se\n"; } else { echo "nerovnají se\n"; }
if ( $str == 'a10' ) { echo "rovnaji se\n"; } else { echo "nerovnají se\n"; }

Znovu 'rovnají se' a 'nerovnají se'. Více na String conversion to numbers.

[edit] špatné odsazení

if ( $a == 1 )
   print "neco\n";
   $a = 100;
print "$a";

Klasická chyba. Když čtete kód tak si většinou nevšimnete, že $a = 100; se vykoná vždy.

[edit] překlep

if ( !rs ) echo 'aaa';

Neohlásí, že před 'rs' chybí '$'. Při E_NOTICE píše "Use of undefined constant rs - assumed 'rs'."

[edit] kontext proměnných

Proměnné nadefinované v souboru vloženém přes include nebo require nejsou globální (stejně je to u funkcí, kde je to samozřejmější). Prostě jsem jen nečekal, že když něco vložím tak se to chová jinak než kdyby to bylo napsáno přímo.

[edit] no strict

Chybí definování proměnných. V Perlu use strict; use warnings;.

function has_right( $right_name, $right_type=null ) {
 
    if ( empty($right_neme) ) return 0;
 
    if ( ... ) return 1;
    return 0;
}

Všimněte si, že $right_neme je neexistující proměnná, ale je obalena funkcí empty (nebo isset), takže i když máte zapnuto E_NOTICE, tak vás php na překlep neupozorní. Tohle se v perlu s 'use strict;' nemůže stát.

[edit] lcfirst

Existují fukce uc a ucfirst, ale jen lc, lcfirst hledáte zbytečně.

[edit] fmod

Tohle taky ujde. K čemu je operátor % dobrý?

$rodne_cislo_base = '8010163810';
 
$rodne_cislo = $rodne_cislo_base;
t( "%:" . ($rodne_cislo % 11) ); # %:1
t( 'fmod:' . fmod($rodno_cislo, 11) ); # fmod:0
 
$rodne_cislo = (float)$rodne_cislo_base;
t( "%:" . ($rodne_cislo % 11) ); # %:-8
t( "fmod:" . fmod($rodne_cislo, 11) ); # % fmod:0

[edit] Perl

[edit] defined()

# $a a $b se pouzivaji u sortu a jsou definovane
use strict;
 
print "$a";
print "$b";
#print "$c";
# pole nema hodnotu undef
my @ar;
 
#@ar = undef;
#@ar = ();
 
if ( defined @ar ) {
    print "def\n";
} else {
    print "undef\n";
}

[edit] scalar()

Problem je ze scalar reference na pole vraci adresu v pameti. Pro delku je tedy nutne pouzit: scalar( @$ra_pole ).

my $ra_pole = [1,2,3]; 
my $elems = scalar($ra_pole); 
# vypise napr. 23219983
print 'cislo posledniho prvku: ' . ($elems-1);"

[edit] Perl vs. PHP

Personal tools
spřízněné weby
Language