» »

[PHP] narekovaji

[PHP] narekovaji

Mediator ::

Če napišem:

$a = Array("ab"=>1,"b"=>2,"c"=>3);
print "$a['ab']".",";//tukaj javi napako, da 'ab' ne sme biti med apostrofi

medtem ko

$a = Array("a"=>1,"b"=>2,"c"=>3);
print "$a[ab]".",";//VSE OK


V čem je fora, da ne sme biti med apostrofi. Malo se mi zdi nelogično.
Recimo če napišem:

print $a[ab].",";//TUDI VSE OK

Po kakšnem sistemu deluje pretvorba tipov v teh oglatih oklepajih?

BigWhale ::

Tisto v oglatih oklepajih ni spremenljivka, ki bi imela svoj tip. Tisto je samo naslov v polju.

krho ::

print "{$a['ab']}"; should work.
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net

sverde21 ::

Zakaj delaš tole:
print "$a['ab']".",";

IMO čisti nesmisel devat spremenljivko posebej v narekovaje in potem še združevati string. Raje naredi takole:
echo $a['ab'] . ',';

Torej ne rabiš vsake spremenljivke spravljat v narekovaje (npr. echo "$spremenljivka";) raje piši brez narekovajev (npr. echo $spremenljivka;), ker je malenkost hitrejše in kar je najbolj pomembno - koda je lepša/preglednejša.

P.S.: Še en nasvet. Raje uporabljaj echo, ker je hitrejši itd. No raje si sam preberi o prednostih echo-ta.

P.S.2.: Ker predvidevam da si začetnik v PHP-ju bi ti priporočal, da si potegneš Štamcarjev PHP tečaj v PDF-ju in ga prebereš.
<?php echo `w`; ?>

netanyahu ::

Odgovore najdeš v uradni PHP dokumentaciji, v poglavju o poljih.

fiction ::

Se zmeraj ne razumem zakaj recimo:
print "Hello $arr['fruit']";

ni veljavno medtem ko:

print "Hello $spremenljivka"

deluje in se spremenljivka lepo expanda - tukaj pa rabis vse skupaj tlaciti v { }
$arr['fruit'] je isto (dostop do 'fruit' elementa v arrayu,
ki ima kot indekse stringe - hashtable alike).

fiction ::

Smesno (oz. inkonsistentno) je pa da:

print "Hello $arr[fruit]";

lepo deluje (vem fruit je narobe - in samo zaradi tega ker ni definiran fruit bo vse skupaj pomenilo
string 'fruit', ampak vseeno).

Prej rece pa:
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
Sem pogledal v lexer in ima ESCAPED_AND_WHITESPACE token definiran kot [\n\t\r #'.:;,()|^&+-/*=%!~<>?@]+
Torej je ocitno problem v ', ki se nahaja znotraj dvojnih narekovajev in se steje kot whitespace in ne kot zacetek
"stringa za index arraya" znotraj stringa. Je to bug ali se sploh ne da drugace narediti gramatike?

snow ::

Po moje je najbolje, da nobene spremenljivke ne klačiš v narekovaje (' ali "), ostale fiksne stringe pa v ' '.

Če pa res res želiš array izpisovat v narekovajih pa daj:
<?php
$test['aa'] = 5;

echo "{$test['aa']} <- cifra";

?>
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

fiction ::

Dejansko je PHP se bolj obskuren kot se cloveku zdi:
<?php
define('strawberry', 'banana');
$fruits = array('strawberry' => 'red', 'banana' => 'yellow');

print "First: $fruits[strawberry]\n";
print 'Second: ' . $fruits[strawberry] . "\n";
print "Third: {$fruits[strawberry]}\n";
?>
Izpise:

First: red Second: yellow Third: yellow

Torej $fruits[strawberry] znotraj "" je isto kot $fruits['strawberry'], medtem ko
se povsod drugod (tudi znotraj {} v stringu) strawberry smatra kot konstanta,
ki dobi ima vrednost 'strawberry' samo, ce ni definirana.

Ce ne znajo narediti parserja, ki bi delal konsistentno za "simple syntax variable parsing",
naj pac vse skupaj opustijo (ter samo zacasno ohranijo sintakso kot kompatibilnost za nazaj)
in postopoma ljudi spodbudijo k uporabi "complex (curly) syntax".
Da ne govorimo o tem, da je najbrz celo expandanje spremenljivk znotraj " " oz. heredoc stringov bloat,
saj obstaja recimo printf() oz. sprintf(), ki to resi na lepsi nacin, ce ne drugega se pa lahko vedno resis
tako da uporabis konkatenacijo stringov.

Na zalost je IMHO PHP en tak zelo nepremisljen jezik. Vedno so neki novi feature-ji, ki naj bi delo olajsali,
ampak v koncni fazi pa samo se bolj zakomplicirajo jezik in tako prispevajo k manjsi produktivnosti.

OmegaBlue ::

Ste bili forkani v [FORK] PHP kot jezik
Never attribute to malice that which can be adequately explained by stupidity.

BigWhale ::

fiction:

IMO, variable znotraj stringov nimajo kaj poceti.

echo "allalala${lala}kaakka" bi morali z zakonom prepovedati.

echo "allalal" . $lala . "alala"

ali pa tako kot si rekel

printf("lalalal%slalalal", $lala);

Vse ostale variante bi pa morali ven zmetat. Vsak, ki pa malo bolj pazi kako programira se bo pa tega ze sam po sebi lotil tako, da imel vse skupaj konsistentno skozi celo kodo in se bo izogibal raznim bizarnostim. :)

mspiller ::

IMO, variable znotraj stringov nimajo kaj poceti.

IMO stringi nimajo kaj poceti v kodi ;) ... Zato imas posebi unite, kjer so definirani ali pa template datoteke. Saj int konstant verjetno tudi nimas kar tako v kodi?

Boljsi od Cjevskega bi bil c# ... aka:
printf("{0} {1} {2} {0}", 1, "bla", 12341234);

Kjer vrstni red ni pomemben, pa se veckrat lahko uporabis isto spremenljivko. Prav tako je kasnejse vrivanje ali pa brisanje spremenljivk lazje.
Isti bonus je pri phpju, kjer so namesto stevilk kar imena variabel. In je uporaba spremenljivk se bolj trivialna.
Mogoce ni lepo. Je pa izredno ucinkovito. Perl ima zelo podobno.

fiction ::

> Boljsi od Cjevskega bi bil c# ... aka:
> printf("{0} {1} {2} {0}", 1, "bla", 12341234);

printf("%1$d %2$s %3$ld %1$d", 1, "bla", 12341234);

Razlika med format specifierji v C-ju je samo to, da moras
pac povedati kaksnega tipa je zadeva (ker lahko izpises
poljuben del pomnilnika). Zato je treba definirati kaj je tist
bajt oz. zaporedje bajtov (stevilka, crka, naslov stringa ali kaj drugega).
Razni novi jeziki so itak objektni in imajo nek toString(), poleg tega
pe ne omogocajo dostopa do poljubnega kosa pomnilnika,
tako da formatiran izpis sploh nima vec toliko smisla.

> Isti bonus je pri phpju, kjer so namesto stevilk kar imena variabel. In je uporaba
> spremenljivk se bolj trivialna.

Samo potem je isto ce naredis konkatenacijo stringov,
ne pa da vkljucis vse v en kvazi string (format specifier je misljen samo
kot prostor kjer se mora nahajati nekaj) in vedno
delati nek impliciten sprintf() je brezveze.

mspiller ::

Samo potem je isto ce naredis konkatenacijo stringov,

Jasno da je isto. No skoraj. Namrec tudi drugje ne priporocajo omenjene konkatenacije stringov. Zakaj? Zaradi gettext prevajanja (ki ga php tudi podpira).
Meni osebno je konkatenacija se najslabsa in najmanj pregledna od vsega ostale ostalega. Rajsi printf (ki ga tudi php podpira).

mspiller ::

printf("%1$d %2$s %3$ld %1$d", 1, "bla", 12341234);

Kolikor je meni to znano, to ni standardni C. Gcc oz. bolje receno glibc to podpira. MS kompiler pa npr. ne. V mingw npr. tudi ne dela (verjetno ker uporablja printf, ki je v msvcrt.dll). Toliko glede portabilnosti.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Python] Tutoriali za začetnika v Notepad++ (strani: 1 2 )

Oddelek: Programiranje
7915094 (12188) black ice
»

[PHP]Zajem podatkov iz baze

Oddelek: Programiranje
353747 (3384) cobrica
»

[php] spremenljivke v mysql poizvedbi

Oddelek: Programiranje
61073 (923) KoMar-
»

[php, mysql] sortiranje izpisa iz baze

Oddelek: Izdelava spletišč
262556 (2075) Binji
»

Java problem z array

Oddelek: Programiranje
6985 (876) St@jler

Več podobnih tem