Archive dla: Marzec, 2010
PHP 5.3 obiekty – czyli łatwe przejście z języków C# i Java
stworzony przez robert 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:
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 */
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;
}
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.
Windows Mobile 6.5 zostaje
stworzony przez Tomek Dziemidowicz dnia mar.08, 2010, w kategorii: Windows Mobile
Oficjalnie potwierdzone: WM7 niezgodny z WM6.5. Oznacza to, że aplikacje napisane na Windows Mobile 6.5 (i starsze wersje) nie będą działać pod kontrolą nowego systemu. Microsoft zerwał z kompatybilnością wstecz aby skupić się na rozwoju nowej funkcjonalności w Windows Phone 7. Microsoft zapewnił jednocześnie, że nadal będą pojawiać się urządzenia z systemem Windows Mobile 6.5 i że będzie on wspierany jeszcze przez wiele lat.
Odetchnęliśmy z wielką ulgą!


