PHP FAQ idėja

Su Lakūnu sugalvojom, kad reikia labai dažnai užduodamų PHP klausimų sąrašo, nes tie patys klausimai dažnai kartojasi tie patys per tą patį. Idėja paprasta: rinkti užduodamus klausimus #php kanale ir sudėti juos į duomenų bazę. Jei vėl pasikartoja toks pats klausimas, užteks tik papastinti linką (na… mes tikimės kad užteks… Turbūt nelabai). Žodžiu turėtume palengvint sau gyvenimą nebeatsakinėdami į tą patį klausimą dešimtąjį kartą. Bent jau teoriškai turėtumėm palengvint sau gyvenimą. ;)

#php susitikimas

Šios dienos #php kanalo tema:

2003 gegužės 16 d. (penktadienis) – preliminari #PHP meeto data… Vieta? Rotušėlė? Preliminarûs dalyviai: MrTenente, Nightblade, scooox, moxliukas, … Veiksmo vietos, idejos labai priimamos ;]

Va #php susitikimo jau seniai trūko. O juk pernai kiekvieną penktadienį toks vykdavo. Tikiuosi į šį susitikimą ateis daug žmonių („daug“ – tai bent kokie 8-10), nes poreikis tam kaip ir yra ;)

Tiesa, nežinau kaip dėl „Rotušėlės“. Mane jos atžvilgiu kankina dvi prieštaringos mintys: viena vertus „Rotušėlė“ yra nekoks kabakas su nekokiu aptarnavimu ir panašiai, o kita vertus – tai #php tradicija.

PHP print revisited

Paskaitęs mano rašliavas apie PHP print() funkciją, Lakūnas nurodė man atitinkamą manualo skyrių ir pasirodo, kad print() yra operatorius. Va čia tai buvo netikėta. Jau man galvoj nebesutelpa viskas :/

Nors print() ir yra operatorius, echo() yra šiaip kalbos dalis. Štai <?php print print 'foo'; ?> spausdina „foo1“ – kaip ir tikėtasi, tuo tarpu <?php print echo 'foo'; ?> meta klaidą „Parse error: parse error, unexpected T_ECHO“

Vogtos idėjos iš CGI::Application

CGI::Application yra puikus modulis Perlui, kuris leidžia išvengti ilgų „if/elsif/else“ blokų pagrindinėje web programos byloje. Pagrindinės bylos (tarkim index.pl) tikslas yra nuspręsti, kurį kodą vykdyti. Tarkime, per HTTP GET kintamąjį op perduodama informaciją, koks kodas turi būti įvykdytas. Tokiu atveju paprastas index.pl atrodytų kažkaip taip:

#!/usr/bin/perl -w
use CGI;
my $r = new CGI;
if($r->param('op') eq 'forumas') {
	# forumo kodas
} elsif($r->param('op') eq 'naujienos') {
	# naujienų kodas
} ...
...

Žodžiu po truputį viskas tampa didele koše (šios svetainės kol kas būtent taip ir atrodo). Su CGI::Application viskas daug gražiau ir paprasčiau: kiekvienam svetainės „moduliui“ sukuriamas atskiras Perlo modulis, o index.pl tik automagiškai užkrauna tą modulį ir jį paleidžia.

Ar galima kažką panašaus padaryt su PHP? Taip. Šitokį automagišką klasių užkrovimą teko matyti Flexi kode, tad tai tikrai ne nauja idėja. Tiesa, aš pats nesu nieko panašaus daręs, tad čia daugiau teoriniai pamąstymai.

Pirma reiktų apsirašyti index.php. Jo tikslas – nuspręsti, kurią klasę užkrauti, ir kam perduoti kontrolę. Tad galbūt užtektų tokio kodo:

<?php 
$galimos_klases = array('foo', 'bar');  # Čia reiktų imti iš kokio nors konfigūracinio failo.
if(isset($_GET['op']) && 
   in_array($_GET['op'], $galimos_klases) &&
   is_file($_GET['op'].'.class.php')) {
	include_once($_GET['op'].'.class.php');
	$foo =& new $_GET['op']();
	print $foo->output();
}
?>

Šis kodas faktiškai turėtų inkludint atitinkamas bylas, jei $_GET['op'] yra foo arba bar. Po inkludinimo, ji inicijuoja atitinkamą klasę (per $foo = new $_GET['op']();) ir iškviečia tos klasės funkciją output(). O šta čia kažkas panašaus į pačią foo.class.php bylą:

<?php
class foo {
	function foo() { }
	function output() {
		return "Aš iš foo klasės";
	}
}
?>

Šioje klasėje aprašome konstruktorių (kurs nieko nedaro) ir funkciją output(), kuri atspausdina vieną sakinį. Jei viskas eina pagal planą, iškvietus index.php?op=foo turėtų paleisti šią klasę. Bet tai tik teoriniai samprotavimai, šis kodas realiai nebandytas ;)

CSS rolloveriai

Kažkas #php kanale paklausė, kaip įmanoma padaryti su CSS, kad pasikeistų lentelės langelio fonas. Šiek tiek pasikrapštęs (aišku galėjau paieškot internete, bet su GPRS gyvenu) sukurpiau panašų dalyką, visai be lentelių. Kiek bandžiau, jis veikia su IE6.0, Opera 7.0 ir Phoenix0.5 (tiksliau beveik 0.6 – kažkoks naktinis buildas). Štai šio dalyko kodas:

<style type="text/css">
.list { margin: 0ex; padding: 0ex; }
.list li { 
	border: 1px solid #333; 
	background: #999; 
	color: #333;
	display: block;
	float:left;
}
.list li a {
	padding:0.0em 1em 0.0em 1em;
	color: #333;
	background: #999;
	text-decoration: none;
}
.list li a:hover { background: #ccc; color: #333; }
</style>
<ul class="list">
<li><a href="foo">foo</a></li>
<li><a href="bar">bar</a></li>
<li><a href="baz">baz</a></li>
</ul>

W3C CSS validatorius sako, kad šiame CSS klaidų nėra. Visas šis dalykas padarytas su nesunumeruotu sąrašu (<ul> ir <li>. Tai iš HTML pusės). Klasei „list“ nustatytos nulinės paraštės (nes pagal nutylėjimą <ul> yra pridedama nemaža paraštė iš kairės). Visa magija, kurios pagalba <li> neišsidėsto vertikaliai yra eilutėse display: block; ir float: left;.

Visa problema su IE yra tame, kad jis leidžia uždėti :hover tik „<a>“ elementui. Lengviausia būtų uždėti skirtingą foną elementui .list li:hover, bet tai neveiks IE (o kad ir kaip ten būtų, visgi IE naudoja apie 80% piliečių). Todėl į <li> įdedam <a> ir su CSS jį praplatinam per visą plotį padidindami „padding“. Vienintelis dalykas, kurį liko padaryti – pakeisti foną, pelei užėjus ant nuorodos. Tai aprašoma .list li a:hover elemente.

Tikiuosi bent jau kam nors buvo šiek tiek naudos ;)

Ginant struktūrinį žymėjimą

Simon Willison išreiškė savo nuomonę apie HTML naudojimą tik dokumento struktūrai aprašyti. Jo nuomone, jei profesionaliai dirbate interneto rinkoje ir dar nepradėjote naudoti CSS, tai kenkiate ir sau, ir savo klientams ir savo kolegoms. CSS gal ir ne stebuklingas dalykas, kuris išsprendžia visas problemas, bet CSS padeda daryti efektyvesnes svetaines. „Efektyvesnes“ – tai matomas daugiau naršyklių, lengvesnes programuoti (ar keisti) ir užimančias mažiau vietos. CSS nėra super sudėtinga. Tiesa, svetainę perversti visiškai pilnai į CSS yra sudėtinga, bet CSS gali padėti išsikrapštyti iš lentelių lentelėse ir permatomų GIF’ų košės.

Pagrindinis dalykas, dėl kurio ginčyjasi Simon’as nėra „CSS prieš lenteles“, jis nori įtikinti, kad HTML turi būti naudojamas struktūrai, o ne dizainui. HTML atskyrimas nuo dizaino turi nemažų privalumų: sumažėjęs kodo dydis, lengviau keičiamas dizainas ir lengvas puslapio pritaikymas įvairioms naršyklėms. Taip, kai kuriuos dalykus kol kas labai sunku pernešti iš HTML į CSS, bet tai dažniausiai dėl prasto naršyklių CSS palaikymo. Tačiau šis palaikymas gerėja.

1000 lankytojų

Šiandieną, praėjus 20 dienų nuo šios svetainės atsidarymo, buvo užregistruotas 1000-asis lankytojas (tiksliau buvo sukurta 1000-oji sesija – tad tikrųjų realiųjų lankytojų turbūt dar gerokai mažiau). Na bet tai šiokia tokia pradžia.

Ši svetainė nebaigta. Ir abejoju ar iš vis kada nors bus išbaigta, nes kaip sako biologai – „We have only one meaning for the word stable – and that is dead.“ Čia aišku daug ko trūksta (tarkim paieškos, BB kodo komentaruose), daug ką galima pagerinti (vartotojų registravimą, pridėti automatinį „referrer’ių“ sekimą, XML-RPC ir dar daug viso kito). Tiesą pasakius, svetainės kodas jau pradeda panašėti į tą baisiąją Perlinę košę, tad reiktų viską tvarkingai ir apgalvotai perrašyti naudojantis CGI::Application moduliu. Žodžiu tik reikia atrast viskam laiko ;)

Pertvarkymai #php kanale

Šiandieną DzHiBaS padarė keletą radikalių pertvarkymų #php kanale – buvo iš naujo perdarytas „access“ sąrašas bei nuimtas automatinis operatoriaus statuso suteikimas. #php kanalas yra turbūt didžiausias su programavimu susijęs kanalas lietuviškajame IRC, tačiau iki šiol jis gerokai kentėjo nuo vyravusio chaoso. „Access“ sąrašas sutrumpėjo nuo 45 iki 13 žmonių ir beveik visi gavo standartinį penktą lygį, kurio užtenka pagrindinėms kanalo funkcijoms atlikti.

Tikiuosi po šių pertvarkymų #php taps tvarkingesnis ir įdomesnis bei naudingesnis tiek senbuviams, tiek naujokams.

PHP funkcijos – kažko nesuprantu

Jau prieš keletą mėnesių pastebėjau, kad PHP print() (na ir echo()) yra kažkokios keistos funkcijos ta prasme, kad nebūtina jų argumentus dėti į skliaustelius. Žodžiu veikia abu šie variantai:

print('foo');
print 'foo';

Jei antrą variantą bandysit padaryt su bet kuria kita funkcija – PHP pradės keiktis. Taigi, atsiverčiau PHP manualo skyrių apie „print“. Vat ten radau tokį daiktą:

print() is not actually a real function (it is a language construct) so you are not required to use parentheses with it.

Tai kas per velnias tas „language construct“, ir kodėl tai turi būti dar viena išimtis? Vėlgi grįžtu prie manualo ir ieškau kas tas „language construct“. Jie skiriasi nuo funkcijų tuo, kad function_exists() grąžina FALSE. Dar vienas praktinis skirtumas: „language construct“ negalima iškviesti netiesiogiai, per $func="print"; $func($somevar). Hmmm… Atrodo tie „language constructs“ nieko gero neduoda, tik apriboja ką aš galiu daryt. Ar aš kažko nesuprantu?

Aišku tai dar ne viskas. Tų „language constructs“ yra visokių. Tai ir return(), array(), list(), exit(), echo(), isset(), unset(). Na, dar return ir array suprantu, bet kuo ypatingos kitos funkcijos? Be to, kodėl isset negalima iškviesti be skliaustelių? Hrrr…

if(!function_exists('print')) { print 'print nėra'; } # atspausdina 'print nėra' ;)