Seky a skřeky

Z mj41.cz

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.

Obsah

PHP

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'.

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.

š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.

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'."

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.

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.

lcfirst

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

Knowledge wants to be free, just like these atrilces!

Perl

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";
}

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

Perl vs. PHP

spřízněné weby
Jazyk