Documente Academic
Documente Profesional
Documente Cultură
PHP Oop XML
PHP Oop XML
Programarea orientatã-obiect în PHP Pentru funcþiile membru, în loc de construcþia sintacticã „->”, în
Limbajul PHP, mai ales de la versiunea 4, oferã implementarea unora PHP 4 se permite „::”. Astfel, codul de mai sus este echivalent cu:
dintre cele mai importante aspecte ale programãrii obiectuale: încapsu-
larea datelor, moºtenirea, polimorfismul. Astfel, PHP dã posibilitatea $student_year = $stud::getYear();
programatorului sã exprime distincþia dintre proprietãþile generale ºi
cele specifice obiectelor cu care lucreazã. Vom ilustra aceste caracteris- Moºtenirea
tici prin câteva exemple concludente. Moºtenirea reprezintã posibilitatea folosirii datelor sau metodelor defi-
nite în prealabil de o anumitã clasã în cadrul unei clase derivate din
Încapsularea prima. Relaþia de derivare se specificã prin cuvântul-cheie extends:
Încapsularea datelor reprezintã un mecanism de protecþie a membrilor
de tip datã, accesul la ei realizându-se exclusiv prin intermediul unor <?php
metode specifice ºi nu în mod direct. Acest lucru se realizeazã prin in- class GoodStudent extends Student {
termediul claselor, dupã cum se poate remarca din fragmentul de cod // date-membru
PHP de mai jos: var $prizes; // premii
// metode
<?php function setPrizes($p) {
class Student { $this->prizes = $p;
// date-membru }
var $year; // an function getPrizes() {
var $age; // vârsta return $this->prizes;
var $name; // nume }
// metode }
function setYear($y) { ?>
$this->year = $y;
} Putem scrie urmãtoarele linii:
function getYear() {
return $this->year; $goodstud = new GoodStudent;
} // apel de metodã din clasa de bazã
... $goodstud->setAge(21);
} // apel de metodã din clasa derivatã
?> $goodstud->setPrizes(2);
Datele-membru se definesc utilizând var, putând avea orice tip (întreg, În PHP moºtenirea multiplã nu este încã posibilã. Nu putem avea, de
tablou sau chiar obiect). Metodele se specificã prin declaraþii de funcþii exemplu:
care prelucreazã membrii clasei. Pentru a accesa datele clasei, metodele
vor trebui sã se foloseascã de construcþia $this->variabila, altfel vari- class GreatStudent extends GoodStudent Genius {
abila se considerã a fi localã în cadrul acelei metode. ...
Vom crea un obiect prin operatorul new, exact ca în limbajul C++: }
$stud = new Student; Putem însã redefini o metodã în clasa derivatã. În PHP 3, dacã decla-
rãm un membru-datã în clasa derivatã având acelaºi nume ca un mem-
Accesarea metodelor clasei se realizeazã astfel: bru-datã al clasei de bazã, atunci nu mai putem accesa membrul-datã
din clasa de bazã, el fiind „ascuns” de membrul-datã al clasei derivate.
$stud->setYear(4); În PHP 4, pentru a accesa membri ai clasei pãrinte ne vom folosi de
$student_year = $stud->getYear(); construcþia „::” (exact ca ºi în C++).
Din pãcate, membrii datã ai clasei pot fi accesaþi direct, neputându-i Constructori
declara privaþi. La fel, metodele nu pot fi specificate private sau prote- PHP permite specificarea constructorilor, ei fiind metode cu acelaºi
jate, aºa cum se întâmplã la C++. Astfel, PHP oferã doar suport pentru nume al clasei din care aparþin, fiind apelaþi automat atunci când in-
încapsulare, dar nu o poate impune. stanþiem un obiect al clasei respective. Putem avea de exemplu:
<?php <?php
// necesitã prezenþa clasei definite mai sus require("parseXML.php");
require("parseXML.php"); // folosirea moºtenirii pentru a defini un alt comportament
// substituþia tag-urilor XML cu cod HTML class parseXML2 extends parseXML {
// se folosesc douã tablouri asociative // indicã dacã existã atributul "email"
$open_tags = array( var $is_email = 0;
"impresii" => "\n<!— generat de parseXML —>\n" . // redefinirea metodelor
"<table cellpadding=\"5\" align=\"center\" function start_element($parser, $name, $attrs) {
border=\"1\">", // apeleazã metoda din clasa de bazã
"impresie" => "<tr align=\"center\">", parseXML::start_element($parser, $name, $attrs);
"nume" => "<td><h4>", // pune ºi link spre adresa e-mail
"ocupatia" => "<td><p style=\"color: blue\">", if (!strcmp($name, "nume")) {
"virsta" => "<td><p><i>", if ($attrs["email"]) {
"text" => "<td bgcolor=\"#EEEEEE\"><p $format = "<a title=\"Trimite mesaj la " .
align=\"justify\">"); $attrs["email"] .
$close_tags = array( "\" href=\"mailto:" . $attrs["email"] . "\">";
"impresii" => "</table>\n" . $this->html_code .= $format;
"<!— sfârºitul generãrii parseXML —>\n", $this->is_email = 1;
"impresie" => "</tr>", }
"nume" => "</h4></td>", else
"ocupatia" => "</p></td>", $this->is_email = 0;
"virsta" => "</i></p></td>", }
"text" => "</p></td>"); }
// instanþiazã ºi iniþializeazã analizorul function end_element($parser, $name) {
$parser = new parseXML(); // închide
$parser->set_xml_file("impresii.xml"); if (!strcmp($name, "nume")) {
$parser->set_open_tags($open_tags); if ($this->is_email) {
$parser->set_close_tags($close_tags); $format = "";
// ruleazã analizorul $this->html_code .= $format;
$parser->parse(); }
// afiºeazã rezultatul }
echo $parser->get_html_code(); // apeleazã metoda din clasa de bazã
// distruge obiectul parseXML::end_element($parser, $name);
$parser->destroy(); }
?> }
?>
Clasa definitã este suficient de generalã pentru a putea fi utilizatã pen-
tru orice tip de document XML. Tag-urile netratate de programul nos- Noul membru de tip datã is_email este folosit pentru a putea închide
tru vor fi ignorate. corect tag-urile elementului <a> (se poate întâmpla ca atributul email sã
va fi urmãtorul: