« 1 2 »
Autor Zpráva
Jcas
Profil *
Zrovna jsem zavítal do učebnice php. Trochu jsem si ji pročítal a musím vám říct, že máte skvělý cíl chci poděkovat a pochválit aktivitu tvůrců. Děkuji

Také tam máte zajímavé debaty a tím mě napadá. Nenapadlo Vás, najít si pár laiků - samouků a ty Vaše texty konfrontovat s nima. Je totiž spousta věcí, které se opakují stále dokola (i na jiných webech) a pak jsou prvky, které člověk nikde nenajde a řeší je v praxi pokus-omyl a zakládá vlákna v diskusi.

Jestli mohu tedy podotknout pár postřehů.
1. V prvním příspěvku (aby člověk nemusel procházet celou debatu a hledat odkaz) na aktuální verzy dílu. Někde je a někde ne. Nebo prostě napsat - zatím nezveřejněno, zatím ve výrobě.
2. Konfrontace článku s BFU uživatelem. (jako jsem např. já)
3. Když nějakej nováček začne dělat stránky a začne ho to strašně bavit, tak přijde do styku s dvěma jazyky. PHP a javascript. Takový laik najednou je v situaci, kdy sbírá informace z dvou odlišných jazyků (které mají něco podobné). Pochopím for v jednom a hned ho chápu i v druhé. Ale jak se narazí na nějaké odlišnosti, tak v tom je zmatek. I když je to o php, tak pokud se narazí na něco, co je zcela odlišné od javascriptu, tak by byla skvělá poznámka "pozor, v javascriptu se to píše jinak". Asi si momentálně na nic nevzpomenu, ale vím, že jsem na to už mockrát narazil. (Nedávno jsem narazil na zajímavou věc, i když to asi není správně. Volám fc dřív, než jsem ji vytvořil. Zajímavé, že to v php prošlo. V jvscriptu by to neprošlo.)

4. Jako laik mám stále největší problémy v syntaxi v praktickém použití. Co kdy a jak mohu požít. Můžu udělat mezeru?, Můžu tohle vnořit sem?, Můžu inicializovat proměnou zde a takto?
Příkl. Nevím, jak se jmenuje ta rozhodovací podmínka.
podmínka:ano?ne
Jaké bylo překvapení, že ji nelze použít v echo. U příkazu echo si klidně mohu použít zřetězení, nebo jiné prvky z php, ale ne co mě napadne.


Pár konkrétních věcí.
Pole:
Inicializace je asi jasná a snadná. Ale kdy a jak musím pole inicializovat?
Kvůli tomuto problému, který stále nemám vyřešen praktikuji jednoduchou věc.
Jak chci používat nějaké pole, tak jdu hned na začátek souboru a strčím tam
$pole=array();
Tímto způsobem se vyhýbám problému, kterému nerozumím. Protože jsem už narazil na problém, že pole bylo inicializované nějak blbě, nebo pozdě. Řešení m dal jvascript, kde doporučují všechny proměnné inicializovat "var=..." dřív než pozdě.
Člověk by si řekl, že $pole[]="pepa" asi stačí na inicializaci pole. Asi ne.

Foreach - trochu problém pochopit, co to obnáší v praxi, že pracuje s kopií pole.
Proměnné ve foreach. Zřejmě cokoliv, jako foreach(), while(), if() se chová jako funkce. Tedy jakoukoliv $ v ní vytvořím je lokální proměnná pro tu funkci a tudíž neviditelná pr okolní script.
Zatím t nemám ověřeno a odpověď jsem nikde nenašel - poze si to domýšlím. Jde o to, že když v foreach používate $ pro klíč a hodnotu, a máte tam foreach mockrát, tak najednou docházejí slova, jak tu proměnnou pojmenovat.

A jako nejsložitější věc, kterou jako laik pociťuji je ukončení a navrácení se z funkce. Čtu to stále dokola. Už jsem viděl spousty dobrých článků, ale stále v tom mám nejasnosti. (v obou jazycích).
function paticka() {
    return $foot='</div></body></html>';
}
echo foot();

function paticka() {
    return '</div></body></html>';
}
echo $foot=foot();

function paticka() {
    return $foot = '</div></body></html>';
}
echo $foot=foot();

function paticka() {
    $foot = '</div></body></html>';
return $foot;
}
echo $foot;

Jak jsem říkal. Nejtěžší ze všeho není pochopit základy, ale kdy a jak a co mohu použít.
A nedej bože, že najdu ve fc break: Takové break a za ním return ve mě vyvolává přímo šílenství.
Jak mohu ukončit funkci a přitom si ještě něco vrátit?


A poslední velký problém mám se samotnou stavbou scriptu.
Co má být dřív a co má být později. Ale to už je asi věc osobní, protože ne každej může dělat scripty a je to i trochu tvůrčí jedinečnost, jak si kdo script udělá.
Třeba jsem zaznamenal, že když jsem vzal kus kódu a umístil ho na špatné místo v souboru (moc nahoře, nebo moc dole), tak mi to nefungovalo. Logicky naprosto jasné, ale nikdy jsem nikde nenašel článek, který by mi dal základy, jak to strukturovat. Musel jsem na to dojít sám.


Omlouvám se, že jsem založil toto příšerné vlákno. Jen jsem se chtěl pokusit sdělit pár hlavních problémů, se kterýma se jako laik potýkám.
Alphard
Profil
1. Ve vývoji :-)
3. Zase to nechceme přehánět, je to web o PHP, znalosti JS nejsou nutné a nechceme ho zmiňovat na každém kroku. Kdybyste si vzpomněl, co konkrétně byl problém, můžeme zvážit přidání.
4. Zřejmě myslíte ternární (nebo podmíněný) operátor (správné pořadí je ?:). Je vysvětlen v díle o podmínkách, který není ještě zveřejněn. V echo jej použít lze, zřejmě vám chybělo ozávorkování, nebo jste ji napsal do řetězce, nebo nějaká jiná chybička. Je tam uvedený příklad
echo "Stav souboru $soubor: ".(is_file($soubor) ? "Soubor je dostupný" : "Soubor nenalezen");

5. foreach apod. se nechová jako funkce, v nich vytvořené proměnné jsou viditelné, dokud se nepřepíší. Tohle ale ani nevím, kde by mělo být zmíněno. Cyklům a podmínkám se věnujeme před funkcemi, v podstatě se předpokládá, že čtenář o platnosti proměnných ještě níc neví.
anonymníí
Profil *
Jcas:
PHP s JavaSciptem nesouvisí a není potřeba, aby se je někdo učil oba (a navíc současně). Pak nevznikají programátoři, ale patlalové. V učebnici o PHP samozřejmě zmínka o JS nemá co dělat. Proč zrovna (a pouze) JS a ne další jazyky, kde se to dělá taky jinak?

Nevím, jak se jmenuje ta rozhodovací podmínka.
Ternární operátor.

Jaké bylo překvapení, že ji nelze použít v echo.
Jaktože ne? Záměrně uvedu složitější podmínku, zkus si před ní proměnnou a definovat a přiřadit jí hodnotu 3: echo isset($a) && $a == 3 ? 'A existuje a rovná se třem' : 'A buď neexistuje, nebo se nerovná třem';

echo $foot=foot(); je blbost, co tě k tomu přivedlo? Správný zápis je, pokud pominu, že je nesmysl motat HTML do PHP a že deklaruješ paticka() a voláš foot():
function paticka() {
    return '</div></body></html>';
}
echo paticka();

Takové break a za ním return ve mě vyvolává přímo šílenství.
Break ukončuje zpravidla case ve switchi (a i ten switch), return funkci.

Možná bylo v tvém příspěvku více dotazů, vzal jsem ty, které mi přišly na oči v tom dlouhém elaborátu mezi prvními.
Jcas
Profil *
Pouze moje praxe a moje zkušenosti.
JS jsem zmínil proto, že když jsem se začal věnovat stránkám, tak to byly dva jazyky, které jsem začal vnímat současně a současně jsem se je začal učit. Jako když se učíte naráz Němčinu a angličtinu. Začne se to míchat mezi sebou.

Příklad s volání patičky je překlep způsoben kopírování. Opravdu má být všude paticka(). Nicméně, pokud foot() nahradíme za paticka(), tak jsou máme 4 rozdílné zápisy. Teoreticky by asi měly fungovat všechny 4.

Proč mi tenkrát ten ternární operátor nefungoval nevím. Jistě byla chyba u mne.
Pouze si pamatuji, že si po dvou hodinách, co jsem se s tím pral, jsem použíl:
$prom = $prom == podminka ? ano : ne;
echo $prom
A problém byl vyřešen.

Tak jako tak, to na co se snažím poukázat je, že jako laik nemám problém pochopit, co dělá cyklus, ale největší problém je použití v praxi. A jako příklad uvedu: (protože si to už zase nepamatuji a jsem znova na začátku = tedy problém laika)
$prom = $prom == podminka ? ano : ne;
$prom = ($prom == podminka ? ano : ne);
$prom = {$prom == podminka ? ano : ne;}

Když si vezmu zpracován zleva do prava, tak by to asi první příklad měl fungovat.
$prom = První díl: přiřaď nějakou hodnotu $prom
$prom == podminka ? ano : ne; Druhý díl se bude brát jako celek, takže se vyhodnotí podmínka tím dostaneme nějaký výsledek, který se přiřadí $prom.
Takže závorky jsou asi naprosto zbytečné.
juriad
Profil
Já také zkusím přispět svou troškou do mlýna Jcasova zmatku. Snad to alespoň něco objasní.

1)$pole[] = "pepa" používá operátor závorky []. Pokud v těch závorkách není nic uvedené, znamená to „na konec pole“.
Je to operátor, který funguje jen s poli. Tedy $pole již předtím muselo být pole. Nejjednodušeji pole (prázdné) vytvoříš zavoláním array()

Obdoba pro čísla by byla:
$cislo -= 6;
Také nemá smysl od proménné odečítat šestku, pokud to již předtím nebylo číslo. Operátor -= je definovaný jen pro proměnné ve kterých je číslo.

Závěr: přestože v PHP neříkáš, jaký je typ proměnné (číslo, pole, ...), PHP ten typ zná a určí ho podle toho, co do proměnné přiřadíš.
Předtím než s obsahem proměnné budeš manipulovat (přidávat hodnotu na konec (u pole), příčítat/odečítat u čísel), musí v té proměnné již být něco, co má smysl.

2) Platnost proměnných:
Proměnná je platná pouze v aktuální funkci. Tedy následující kód skončí chybou. Tu chybu PHP přežije, a pokud nemáš zapnuté logování chyb, nemusíš se o ní dozvědět.
$a = 5;
function x() {
        echo $a;
}
x();

Proměnná definovaná v cyklech a dalších konstruktech je definovaná po zbytek funkce.
for($a = 0; $a < 10; $a++) {
  $b = $a * $a;
  if ($b > 30) {
    break;
  }
}
Obě proměnné jsou definované uvnitř. Co bude po provedení tohoto kódu v $a a $b.

3) Break. Tím se dostáváme k breaku.
Není na něm nic magického, prostě ukončí aktuální cyklu (for, foreach, while, do-while) nebo case. A program pokračuje těsně za jeho koncem (cyklu, či case).
Tedy cyklus s proměnnou $a nastavenou na 6 (6*6 = 36 > 30) a $b bude těch 36.

4) Return. Jelikož už víš, že break funkci nikdy neukončuje, možná pochopíš, proč existuje přikaz return.
Ten funkci vždy okamžitě ukončí. A pokud mu dáš jeden parametr (ok není to funkce, ale snad mě chápeš), lze říkat, že funkce něco vrátí. Návratovou hodnotu z funkce uložíš do proměnné:
function x() {
  return 3;
}
$a = x();
Nic složitého na tom přece není.

Když projdu ty tvé příklady s return, tak:
Napřed poznamenám, že funkce se asi měla jmenovat foot(). Protože funkce patička není nikde definovaná. :)

- první uloží řetězec '</div></body></html>' ještě uvnitř funkce do proměnné $foot, která se ale nikdy nepoužije, protože se funkce okamžitě ukončí. Tato proměnná zvenku funkce není dostupná. Ten vrácený řetězec následně rovnou vypíšeš (bez přiřazení do proměnné).
- druhý naopak rovnou vrátí řetězec a vrácený řetězec uložíš do proměnné a zároveň ho vypíšeš. Po tomto výpisu, bude existovat proměnná $foot, která bude obsahovat '</div></body></html>'.
- třetí je kombinace prvního a druhého. Každá z těch proměnných je definovaná uvnitř jiného rozsahu platnosti a proto spolu nijak nekolidují a nic nesdílí.
- čtvrtý je blbost. Ty tu funkci nikde ani nezavoláš. A i kdybys ji zavolal, tak uloží něco do proměnné $foot platné uvnitř té funkce. Ta funkce obsah té proměnné vrátí jako svůj výstup. Jelikož ale tu funkci nikde nevoláš a ani nepoužiješ její návratovou hodnotu, proměnná $foot mimo tu funkci neexistuje a PHP vypíše chybu.


PHP ne vždy vyhodnocuje zleva. Podívej se na tuto šílenou tabulku:
http://www.php.net/manual/en/language.operators.precedence.php
Jcas
Profil *
Ukázka problémů u mě (jakožto u divného začátečníka).
Udělám si cvičný testík chápání.
foreach nechci, protože pracuje s kopií pole a nevím co to obnáší a o co to znamená.
for nechci, protože mám věčný zmatek s počítáním od nuly.
Tak zkusíme něco nové a na jaký problémy přitom narazím.
ps. tvořím to za pochodu.

$pole = ('a', 'b', 'c');    //inicializujeme pole

while(isset($pole[$i])) {
příkaz;
$i++;
}
Proč to nefunguje? Aha, $i nebyla deklarována, takže podmínka nebyla nikdy splněna.
Řešení:
1. Hned na druhém řádku deklarujeme $i=0; Pak by to mohlo fungovat, jako zajímavý procházení polem.
2. Stačí pro deklaraci proměnné $i++;?? Potom by pro funkčnost stačilo použít Do_while

ps. takovýto způsob procházení polem jsem nikde neviděl. Právě jsem si ho vymyslel.
anonymníí
Profil *
Jcas:
ps. takovýto způsob procházení polem jsem nikde neviděl. Právě jsem si ho vymyslel.
Zatím hlavně žádné pole nemáš, chybí ti klíčové slůvko array.

Pole se dá procházet různými způsoby, proč se bojíš foreache, který se na to používá asi nejvíce a nejčastěji? Oproti whilu má mj. výhodu, že si automaticky iteruje proměnnou, tu tedy nemusíš ručně na konci cyklu inkrementovat.
Jcas
Profil *
Juriad
Když fc vrátí proměnnou return $prom, tak tato proměnná je dostupná všem a celému scriptu kdykoliv? (Samozřejmě pokud fc někdy nějak zavolám)
Stejně tak, když u returnu použiju přiřazení. A vracení pole?

příklad,

function pokus() {
$a = 1;
$b = array('a', 'b', 'c');
return $a;
return $b;
}
ps. další neznalost - lze 2*return? Co když chcu vrátit 2 proměnné.
pokus();
echo $a;
foreach($b as $hodnota) {echo $hodnota;}
a
function pokus() {
return $a=1;
}
juriad
Profil
Tyto tři ukázky jsou víceméně ekvivalentní.
Toto je největší opruz, ale máš vše pod kontrolou.
$i = 0;
while ($i < length($pole)) {
  $prvek = $pole[$i];
  echo $pvek;
  $i++;
}

Toto je vhodné, pokud chceš pole modifikovat během procházení:
for ($i = 0; $i < length($pole); $i++) {
  $prvek = $pole[$i];
  echo $prvek
}

Toto je vhodné jen pro čtení procházeného pole:
foreach($pole as $i => $prvek) {
  echo $prvek;
}



Jcas:
Vrátit dvakrát nelze. První return ukamžitě způsobí ukončení funkce. Lze to však obejít:
function two() {
  $prvni = 1;
  $druha = 2;
  return array($prvni, $druha); # vratim pole obsahující dvě hodnoty
}

#uložím si to pole a pak přistupuji k jednotlivým prvkům
$poleDvouPrvku = two();
$prvni = $poleDvouPrvku[0];
$druha = $poleDvouPrvku[1];

# případně je možné použít list, který to rovnou rozháže do proměnných:
list($prvni, $druha) = two();



function a() {
  return $x = 2;
}
Přiřazení u return nemá smysl. Protože tím uložíš hodnotu do nějaké proměnné platné uvnitř funkce a okamžitě funkci opustíš. A ta proměnná s koncem funkce zanikne.
Jcas
Profil *
anonymníí - jak jsem již psal. Mám problém s názvy proměnný a jak mi bylo vysvětleno, tak nejsou lokální.
Za druhé mám problém s tou kopií pole. Nevím co to znamená a nevím, jaké to má následky. Dost často procházím pole s tím, že jej chci upravovat.
A za třetí. Není o tom, co chci nebo nechci používat. Je to tom, že i když neustále studuji základy, tak narážím na problémy, které následně odstraňuji dle chybových hlášení. Bavíme se manuálu pro laiky a tak schválně ukazuji, s čím se jako laik potýkám. I když si výmýšlím nový střeštěný způsob procházení, tak ten příspěvěk byl o tom, že jsem na razil na inicializaci $i, kde jsem měl nejasnosti.

Všechny tyto moje příspěvky nejsou o řešení daného problému, ale aby poukázali na to, co se těžko hledá. Jak jsem řekl. Je spousty článků, které ti naprosto stejně vysvětlí, jak funguje foreach. Ale ani jeden, který tě upozorní na to, že $key a $hodnota je viditelná všude. To jsem se po dvou letech dozvěděl dnes tady.
juriad
Profil
Ještě existuje jeden způsob procházení pole (všimni si toho znaku &):
foreach($pole as $i => &$prvek) {
  echo $prvek;
  $prvek = 3;
}

Prostě zvol takový způsob procházení pole, který víš co dělá. Obvykle je to při čtení pole foreach a při něčem pokročilejším for.

To, že $key a $hodnota je viditelná všude vychází z toho, jak je PHP navržené. Proměnná je dostupná od jejího prvního výskytu do konce funkce. Nijak to nesouvisí s cykly. (pomocí unset ji můžeš zrušit, ale snad nikdy to není nutné ani vhodné)


PHP je prostě jazyk, který se docela bouřlivě vyvíjel od jednoduchého jazyku, určeného k drobným změnám webových stránek až po toto monstrum. Proto je PHP plné spousty konstrukcí, za které by si autoři zasložily zavraždit. PHP není čistý jazyk a dost dlouho trvá, než zjistíš, co je vhodné používat a co ne.

Až budeš mít chvíli, přečti si tento seznam:
http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/
Jcas
Profil *
To jsou ty pravé informace: Najdi článek, kde bude věta "Return lze použít jen jednou"
Najdi článek, kde bude věta "přiřazení u return nemá smysl: Požijte napřed přiřazení a pak return"
$x=2;
return $x;
juriad
Profil
Jcas:
Ty return můžeš použít kolikrát chceš, ale k tomu druhému se kód nikdy nedostane. Vždy funkce skončí tím prvním. Proto další return nemá smysl.
Podívej se na tento obrázek (není to PHP, ale chová se to stejně):

Zkus si vysvětlit ty dvě „chyby“ a čím se liší,

Return může vrátit jakoukoli hodnotu, ty ji nemusíš napřed uložit do proměnné a pak vracet proměnnou.
Vždy se totiž vrátí hodnota nebo hodnota proměnné. Vrátit proměnnou je „zkratka při popisu“ vrátit hodnotu, kterou ta proměnná v tom okamžiku obsahuje.
Jcas
Profil *
A existuje ještě jedna věc, na kterou nedokážu najít slušný český článek. závorky. Kdysi jsem viděl slušnej článek u (nevím jeslti mám správný název) Python.
(){}[]. Je to asi docela důležitá věc v okamžiku, že začnu chtít pomocí php komunikovat s mysql.
viz. toto:
`misto` = '{$_POST['misto']}'



Juriad - vrátit hodnotu, ale čeho? Chceš tím říct, že následující fc vrátí hodnotu 2?
function blabla($x=1){
$x++;
return;
}
Alphard
Profil
Jcas:
To je vytržené z kontextu, určitě to bylo v uvozovkách
$query = "`misto` = '{$_POST['misto']}'";
Závorky {} umožňují zapisovat některé složitější výrazy do řetězce, viz cz1.php.net/manual/en/language.types.string.php Complex (curly) syntax.

V tomto případě by stačilo
$query = "`misto` = '$_POST[misto]'";

Správné řešení je ten vstup od klienta escapovat.
juriad
Profil
OK.
Závorky () slouží k změné pořadí výpočtu:
2*(1+2) není to samé jako 2*1+2
To je jediné použití kulatých závorek.

Závorky [] slouží k přístupu k prvkům pole.
$pole = array(1,2,3);
$pole[1]; # hodnota = 2
Od nových verzí PHP lze pole vytvářet i jako:
$pole = [1,2,3];

Závorky {} slouží k definici bloku (if, while, for, ..., funkce):
function a() {...}
for (...) {...}
if (...) {}

U některých konstruktů není třeba ty závorky psát, pak se takový konstrukt vztahuje jen na následující přikaz:
if (1==2) {
  echo '1';
  echo ' rovna se ';
  echo '2';
}
# nevypíše nic
Ale:
if (1==2)
  echo '1';
echo ' rovna se ';
echo '2';
# vypíše rovna se 2
Ta nesplnitelná podmínka se týká jen následujícího přikazu (naznačeno odsazením).
Odsazení není vůbec důležité, je však dobré pro přehlednost. Je vhodné složené závorky vždy psát!


Tolik závorky uvnitř jazyka PHP.
Závorky uvnitř řetězců (v uvozovkách, apostrofové řetězce nevyhodnocují nic) se chovají jinak:

Kulaté nemají zádný význam.

Hranaté přistupují k prvkům pole:
$pole = array(1,2,3);
echo "Prvni prvek pole je $pole[0]";
Ale v případě asociativního pole se uvozovky neuvádí:
$pole = array('prvni' => 1);
echo "Prvni prvek pole je " . $pole['prvni'];
echo "Prvni prvek pole je $pole[prvni]";

Složené závorky obklopují obvykle složitější blok kódu, který se má vykonat přestože by se jinak nevykonal.
$pole = array(1, array(2, 3), 4); #pole obsahuje jedičku, čtyřku a pole obsahující dvojku a trojku)
echo "Prvek ve vnořeném poli je $pole[1][0]"; # vypíše Prvek ve vnořeném poli je Array[0] s chybou *
echo "Prvek ve vnořeném poli je {$pole[1][0]}"; # vypíše Prvek ve vnořeném poli je 2
* ta chyba je v mém případě: „PHP Notice: Array to string conversion in /home/adam/bordel/djpw/platnost/p.php on line 28“
Osobně to vůbec nepoužívám. Raději řetězec rozdělím na dvě části a ty spojím operátorem tečka.
Viz dokumentace: http://www.php.net/manual/en/language.types.string.php kapitola „Variable parsing“.
Jcas
Profil *
Moc Vám děkuju za příspěvky. Dnes musím končit. Ještě si to celé párkrát pročtu, abych vstřebal Vaše informace.
Doufám, že i já Vám jsem něco dal, aby jste viděli, jak může BFU uvažovat a tak Vám to pomůže při tvorbě manuálu pro blbce jako jsem já.
Joker
Profil
Jcas:
Trochu jsem si ji pročítal a musím vám říct, že máte skvělý cíl chci poděkovat a pochválit aktivitu tvůrců.
Díky :)

Nenapadlo Vás, najít si pár laiků - samouků a ty Vaše texty konfrontovat s nima.
Určitě.
I proto je učebnice tak propojená s DJPW. Nejen aby odtamtud tazatelé mohli čerpat informace, ale aby zároveň mohli i nechat zpětnou vazbu.
Připomínky jsou vítány.

1. V prvním příspěvku (aby člověk nemusel procházet celou debatu a hledat odkaz) na aktuální verzy dílu. Někde je a někde ne. Nebo prostě napsat - zatím nezveřejněno, zatím ve výrobě.
Nějaký odkaz by měl být asi všude, jelikož snad vše co má diskusní vlákno je už nějak rozpracované.
U článků které jsem psal já používám jakousi šablonu pro první příspěvek, ale koukám, že u několika kapitol odkazy opravdu nejsou. Přidám je.

2. Konfrontace článku s BFU uživatelem. (jako jsem např. já)
S tím jsem se snažil začít už vlastně jako bod 0. Články jsou založené na zkušenostech z této diskuse a měly by zohledňovat časté problémy a nejasnosti.
A jak jsem psal, v průběhu tvorby i po dokončení jsou připomínky vítány.

3. Když nějakej nováček začne dělat stránky a začne ho to strašně bavit, tak přijde do styku s dvěma jazyky. PHP a javascript.
Ne vždycky.
Obvykle se spíš začne učit jeden jazyk a pak případně další, přičemž PHP může klidně být první. Takže je nutné to vyvážit, pro čtenáře neznalého JS by neustálé zmínky o JS mohly být matoucí.
Nicméně JS se v rámci základního kurzu zmiňuje a na pár místech se myslím upozorňuje na podobnost/rozdílnost nějaké konstrukce. A jedna celá kapitola bude věnovaná skloubení PHP a JS dohromady.

Asi si momentálně na nic nevzpomenu, ale vím, že jsem na to už mockrát narazil.
To je škoda, kdyžtak to klidně napište jako námět do diskuse k příslušnému článku.

Nedávno jsem narazil na zajímavou věc, i když to asi není správně. Volám fc dřív, než jsem ji vytvořil. Zajímavé, že to v php prošlo. V jvscriptu by to neprošlo.
Dobrá poznámka, myslím, že se to v kapitole o funkcích nezmiňuje.
Připíšu to do tamní diskuse.

Jako laik mám stále největší problémy v syntaxi v praktickém použití.
To tam snad většinou je vysvětlené a určitě neuděláte chybu, když syntaxi převezmete z ukázkových příkladů.

Nevím, jak se jmenuje ta rozhodovací podmínka.
podmínka:ano?ne
Jaké bylo překvapení, že ji nelze použít v echo.
Jmenuje se to podmíněný operátor (případně ternární operátor, což je sice jen druh operátoru, ale jelikož žádný jiný ternární operátor PHP nemá, někdy se ty termíny zaměňují).
Bude o něm řeč v kapitole o podmínkách, která už je připravená.
Jak myslíte „ji nelze použít v echo“? Podmíněný operátor lze použít v echo.

Pár konkrétních věcí.
Jedna poznámka, připomínky k jednotlivým kapitolám je lepší psát do diskuse k dané kapitole.
Při revizi textu kapitoly vycházím z připomínek v diskusi k dané kapitole od poslední revize textu.
Připomínky napsané jinde se s velkou pravděpodobností ztratí.
Str4wberry
Profil
Nedávno jsem narazil na zajímavou věc, i když to asi není správně. Volám fc dřív, než jsem ji vytvořil. Zajímavé, že to v php prošlo. V jvscriptu by to neprošlo.

Ehm, tohle by v JS nemělo projít?
Joker
Profil
Str4wberry:
Zrovna v tomhle případě to funguje (vytvoření funkce příkazem function* ve stejném bloku kódu).
Ale Jcas má v podstatě pravdu, že v JS obvykle nejde volat funkci před její deklarací, zatímco v PHP obvykle jde volat funkci před její deklarací.

* nikoliv výrazem s klíčovým slovem function či konstruktorem Function
Jcas
Profil *
Možná blbej nápad, možná dobrá poznámka.
Ještě bych začátečníkům poradil naučit se používat nějakou testovací stránku. Samo si to můžu zkoušet přímo na hostingu, ale asi po půl roce mě napadlo dělat to na svém PC.
Pro JS existují "terminály", kde si člověk rovnou skouší, jak se nějaká část kódu chová.
V php jsem to dělal dlouho přímo na hostingu, což není ideál.
Až potom mne napadlo mít testovací stránku u sebe. Ve windows je na to myslím výborný Easyphp.
U sebe jsem jsem si nainstaloval Apache a nyní když si potřebuje něco vyzkoušet, tak /localhost/test.php nemá chybu.
juriad
Profil
Jcas:
To je popsané v jednom z prvních dílů:
http://pehapko.cz/zakladni-kurz/2-co-je-potreba

Učebnice se netýká JS, proto o jeho vývoji a testování tam není nic zmíněné.
Zkus zdejší kod.djpw.cz.
Jcas
Profil *
Takže blbá poznámka - omlouvám se.
"Co je potřeba jsem nečetl"

ps. Kdybych já měl doporučit editor, tak doporučím Bluefish. Je pod GNU a je fakt dobrý.
Radek9
Profil
juriad:
Učebnice se netýká JS
Respektive se ho týká jediná kapitola, kterou kompletuji, takže ji snad brzy budu moci poslat na schválení.
Jan Tvrdík
Profil
No, čas tu opravit některá chybná tvrzení:

foreach(), while(), if() se chová jako funkce. Tedy jakoukoliv $ v ní vytvořím je lokální proměnná pro tu funkci a tudíž neviditelná pr okolní script.
Není tomu tak, PHP nemá block scope.

juriad:
$pole[] = "pepa" používá operátor závorky [] (...) Tedy $pole již předtím muselo být pole.
To není pravda, pokud proměnná $pole neexistuje, tak bude vytvořena a inicializována jako prázdné pole před tím, než bude operátor vyhodnocen.

while ($i < length($pole)) {
PHP žádnou funkci length nezná, zřejmě si měl na mysli count.

Toto je vhodné jen pro čtení procházeného pole: foreach($pole as $i => $prvek)
To není pravda, ve foreach lze hodnoty pole bez problémů modifikovat, nebo úplně rušit pomocí unset. Jediné, co je problematické, je přidávání nových hodnot.

Ještě existuje jeden způsob procházení pole (všimni si toho znaku &):
Chudák začátečník nechápe základy a ty ho učíš konstrukci, kterou nechápe většina profesionálů. Pokud to použije špatně, tak mu budou vznikat chyby tak bizarní, že přestane věřit všemu, co do té doby chápal.

Jcas:
foreach nechci, protože pracuje s kopií pole a nevím co to obnáší a o co to znamená.
foreach chceš, protože je vhodný skoro ve všech situacích. Nepracuje s kopií pole, ale s kopií iterátoru pole (to taky není přesné). Nelze to vysvětlit přesně a jednoduše zároveň. Pochopit do hloubky, co to vlastně znamená výrazně přesahuje rámec učebnice PHP pro začátečníky. Nejjednodušší bude, když zapomeneš na to, že ti někdo o nějaké kopii něco prozradil.

Return lze použít jen jednou
To není pravda, return lze použít kolikrát chceš, ale provede se jen ten první, na který se při provádění funkce (souboru) narazí. Viz např:
function isOddOrEven($number) {
    if ($number % 2 !== 0) {
        return 'číslo je liché';
        return 'a tohle se už neprovede';
    } else {
        return 'číslo je sudé, tohle se zase může provést';
    }
}


`misto` = '{$_POST['misto']}'
Je to vytržené z kontextu, ale už tak to obsahuje bezpečnostní zranitelnost, protože vstup musíš vždy escapovat.
Jcas
Profil *
Když jsme u toho return a syntaxe. Tohle se smí?
function povinne($hodnota) {
    !empty($hodnota) ? return true : return false;                                        //kontrola vyplněnosti
    }
Medvídek
Profil
Jcas:
Když jsme u toho return a syntaxe. Tohle se smí?
Je to tak trošku zbytečné, rovnou můžete návrat vrátit takto:

function povinne($hodnota) {
     return !empty($hodnota);
}
var_dump(povinne(0)); //bool(false)
var_dump(povinne(1)); //bool(true)
Jcas
Profil *
Jasně, fc sama vrací buď true nebo false, takže nemá cenu abych ji testoval podmínkou.
Takže to lze použít i na:
!filter_var($hodnota, FILTER_VALIDATE_EMAIL)
!ereg("^[0-9]{3} [0-9]{3} [0-9]{3}$", $hodnota)//kontrola formátu tel: xxx xxx xxx
A potom stačí
if(Email($_POST['email'])) {$hláska='spatne vyplnen email'} //function Email($hodnota) {}
Medvídek
Profil
Jcas:
Doporučuji se funkcím ereg* již vyhnout a použít místo toho preg_match, preg_replace.

Jinak doporučuji naopak obrácený postup, u tebe mi přijde podmínka na první pohled nelogická. Takže spíše:

if(!Email($_POST['email'])) {$hláska='spatne vyplnen email'}

function Email($email = ''){
    return filter_var($email, FILTER_VALIDATE_EMAIL);
}
Jcas
Profil *
Mám pro Vás další podmět do učebnice pro začátečníky. Možná je to jenom moje neschopnost, ale z těch negací se zblázním. (možná to tam už máte - nevím)
Myslím, že to mám blbě. Důležité je si uvědomit, co to vrátí.
empty($hodnota) //je hodnota prázdná? vrátí true
!empty($hodnota) //není hodnota prázdná? Tedy je v ní něco. vrátí true.
filter_var($hodnota, FILTER_VALIDATE_EMAIL) //vyhovuje hodnota emailu - vrátí true
!filter_var($hodnota, FILTER_VALIDATE_EMAIL) //nevyhovuje hodnota emailu - vrátí true

takže to mám dobře. Ta negace tam musí být.
« 1 2 »

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0