zawód: programista

Tagi: PHP 5.3

PHP 5.3 obiekty – czyli łatwe przejście z języków C# i Java

stworzony przez dnia mar.13, 2010, w kategorii: PHP

Dzień dobry. Dzisiaj przedstawię w jaki sposób zaprojektować szkielet aplikacji(klas) w PHP, aby w łatwy sposób móc skorzystać np. z przechodzenia po grafie obiektów oraz zalet jakie przynoszą nam nowoczesne środowiska IDE: wspieranie składni pól, metod, autouzupełnianie itp. W przykładzie skorzystam z darmowego aczkolwiek bardzo potężnego środowiska Netbeans 6.8 IDE. Wiadomo, że w języku PHP nie mamy ścisłej kontroli typów, a co za tym idzie na początku może to trochę mylić i uprzykrzać życie. Dlatego pokażę jak wykorzystać narzędzie PHPDoc w celu „zobiektowania” aplikacji oraz skorzystamy z Type Hinting w liście parametrów funkcji i użyjemy polimorfizmu.

Przedstawię jak utworzyć prosty interfejs Data Access Object zawierający statyczne metody dostępu do danych w bazie danych i skorzystamy z klasy ArrayList.php, która jest swoistą czarną skrzynką opakowywującą PHP-owską array().  Wykorzystamy też polimorficzne odwołania do klasy ArrayList w celu zabronienia wstawiania innych typów niż DAO.php (type hinting). Zatem do dzieła!

Tak wygląda kawałek bazy danych:

dbschema

Czas na interfejs DAO.

interface  DAO {
//put your code here
public  static function insertElement(DAO $element);
public  static function getElementById(DAO $element);
public  static function getElements();
public  static function updateElement(DAO $element);
public  static function deleteElement(DAO $element);
public  static function searchElements(DAO $element);
}

Wyjaśnieniu wymaga fakt występowania parametru (DAO $element). Otóż gdy stworzę wkrótce klasę np. ProductEntity, która będzie implementować interfejs DAO będę mógł skorzystać ze sprytnego rozwiązania: Wywołanie statycznej metody klasy ProductEntity z parametrem ProductEntity:

$pr = new ProductEntity(.....);
ProductEntity::insertElement($pr);

Z schematu bazy danych z rysunku widać, że klucz główny tabeli Product jest kluczem obczym tabeli Feature (relacja 1 … *). Zatem klasa ProductEntity oprócz pól tabeli Product(prodId,Title,catId,prodCount,prodAvail,prodDesc) będzie zawierać listę cech(ArrayList) Feature: $features.

class ProductEntity implements DAO {
//
private $prodId;
private $title;
private $price;
/**
*
* @var CategoryEntity
*/
private $category;
private $prodCount;
/**
*
* @var ArrayList
*/
private $features;
/**
*
* @var ArrayList
*/
private $comments;
/**
*
* @var ArrayList
*/
private $productImages;
private $prodAvail;
private $prodDesc;

Tak wygląda deklaracja pól klasy ProductEntity. Nowym elementem są komentarze PHPDoc, które nie mają mocy sprawczej tylko są podpowiedzią dla środowiska NetBeans IDE aby mieć dostęp do metod klasy ArrayList np. : $product->getFeatures->add(new Feature()) poprzez podpowiedzi.

 /**
*
* @var ArrayList
*/

productentity

Tutaj muszę ostrzec przed częstym błędem:

Fatal error: Call to a member function on a non-object

W każdym miejscu gdzie spotykamy listę obiektów jako pole klasy musimy w metodzie get zainicjalizować tablicę bo w przeciwnym wypadku wywołanie get zwróci wartość null, a następnie wystąpi błąd non-object call. Specjalnie nie inicjalizuję wszystkich tablic obiektu ProductEntity, aby zainicjalizować tablicę kiedy będzie naprawdę potrzebna. Czyli tak zwane: Lazy Loading.

/**
* @return ArrayList
*/
function getFeatures(){
//$f= new FeatureEntity(0,$this->getProdId,"","");
//Pobranie z bazy danych rekordów feature gdzie Product.prodId = Feature.prodId
//$this->features = Features::searchElement($f);
return $this->features;
}

Kolejną przydatną rzeczą, którą oferuje PHPDoc jest komentarz @param, który później ułatwi pracę z konstruktorami czy też innymi metodami z parametrem. Oto prosty przykład:

/**
*
* @param int $productId
* @param string $title
* @param float $price
* @param int $prodCount
* @param CategoryEntity $category
* @param int $prodAvail
* @param string $prodDesc
*/
public function __construct($productId,$title,$price,$prodCount,CategoryEntity $category,$prodAvail,$prodDesc) {
$this->prodId = $productId;
$this->title = $title;
$this->price = $price;
$this->category = $category;
$this->prodCount = $prodCount;
$this->prodAvail = $prodAvail;
$this->prodDesc = $prodDesc;
}

Parametry konstruktora

Po wciśnięciu CTRL+P wyświetli się lista parametrów konstruktora.

Teraz czas na ostatnią część czyli modyfikacja klasy ArrayList.php aby przyjmowała w metodzie add($element) obiekty typu DAO. W metodzie next niech zwrócony typ będzie @return DAO.

/**
*
* @param DAO $item
*/
public function add(DAO $item){//Type hinting.
//$this->arrayList[sizeof($this->arrayList)] = $item;
array_push($this->arrayList, $item);
}
/**
*
* @return DAO
*/
public function next(){
if(isset($this->arrayList[$this->pointer]))
{
//return $this->arrayList[($this->pointer++)-1] = $value;
$this->pointer++;
return($this->arrayList[$this->pointer-1]);
}
else
{
return null;
}
}

Zostaje tylko implementacja interfejsu DAO każdej klasy Entity. Implementację interfejsu DAO przedstawię w następnym artykule.

Wszystkie klasy i obraz schematu bazy można ściągnąć tutaj.

1 komentarz :, , , więcej...

Szukasz czegoś?

Użyj poniższego formularza aby wyszukać:

Dalej nie możesz znaleźć czegoś, co według Ciebie powinno tutaj być? Napisz do mnie, postaramy się rozwiązać problem razem!

Odwiedź naszych znajomych!

Kilka polecanych linków...