Klasy i obiekty - podstawy

[31]

<?php

class Book { // klasa obiektów
   public $authors, $title; // własności

   // metoda klasy
   // $this  = aktualny obiekt (instancja)
   public function description() {
       return $this->title.', <i>'.$this->authors.'</i>';
   }
}

// obiekty danej klasy
$book = new Book();
$book1 = new Book();

$book->title = "1984";
$book->authors = "George Orwell";
var_dump($book);

$book1 = new Book();
$book1->title = "Pan Tadeusz";
var_dump($book1);

echo $book->description();
echo '<br />';
echo $book1->description();

Widoczność (powyżej użyto public):

  • private: Tylko dla obiektów danej klasy.

  • protected: Także dla klas pochodnych (zob. dalej)

  • public: Publiczne (dla wszystkich).

Dziedziczenie [32]

<?php
/* 
Dziedziczenie zachowuje metody i własności przodka.

Metody magiczne - nie są wywoływane "wprost", ale z chwilą operowania obiektami:

- __construct - gdy tworzymy obiekt
- __destruct - gdy "zabijamy obiekt"
- __clone - przy kopiowaniu
- __toString - gdy tworzymy jego reprezentację w postaci łańcucha znaków
*/

class Book { 
   public $authors, $title, $exlibris; 

   public function __toString() {
       return $this->title.', <i>'.$this->authors.'</i>';
   }

   public function opis():string {
       return 'ok';
   }
}

class MyBook extends Book {
    public $exlibris; 

    public function __construct(){
        $this->exlibris = 'JW';
    } 
    public function __toString() {
        if ($this->exlibris) 
          return parent::__toString().' ['. $this->exlibris.']';
        else 
          return parent::__toString();
    }

}

$book = new Book();
$book1 = new MyBook();

var_dump($book->opis());
$book->title = "1984";
$book->authors = "George Orwell";
$book1->title = "Pan Tadeusz";

print (string)$book;
// (string) - rzutowanie na łańcuch znaków
print '<br />';
print (string)$book1;

Konstruktor jako „metoda magiczna”

Metody i własności statyczne

[33]

<?php
/* 
Metody statyczne - mogą być używane do włąsności / metod
niezależnych od obiektów (instancji) - dla całej klasy.
Na przykład - jednoznaczny identyfikator.
*/

class Book { 

    private static $lastId = 0;

    private static function nextId() {
        return ++self::$lastId;
    }    

    public function __construct(string $title, string $authors) {
        $this->id=self::nextId();
        $this->title = $title;  
        $this->authors = $authors;
    }
}      

$book1 = new Book('Ogniem i Mieczem', 'Henryk Sienkiewicz');
$book2 = new Book('Raport z oblężonego miasta', 'Zbigniew Herbert');

var_dump($book1);
var_dump($book2);

print "<br />book1->id = ".$book1->id;
print "<br />book2->id = ".$book2->id;

[34]

<?php
/* 
Metody statyczne i encasulation
*/

class camelCase { 

    public static function fromUnderscore($ident) {
        if (!$ident) return $ident;
        $fragments = explode("_", $ident);
        var_dump($fragments);
        print lcfirst($fragment[0]);
        for ($i=1;$i<count($fragments);$i++) {
            print ucfirst($fragments[i]);
        }
        var_dump($fragments);
        $result='';
        foreach ($fragments as $f) {
            $result.=$f;
        }
        print 'Result='.$result;
        return $result;
    }

}      

echo(camelCase::fromUnderscore('Duze_piwo'));

Metody statyczne często stosuje się także do funkcji / zmiennych, które mogłyby być globalne, ale zostały “zamknięte” w klasach (encapsulation).