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 |
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
- next v Perlu je continue v PHP a v C
- Perl vs. PHP
