Dar vieno analitiko svetainė

Petras Kudaras

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 štai č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 ;)