[PHP] OOP Klasy

Klasy są podstawą programowania obiektowego. Są to swego rodzaju kontenery zawierające zmienne i funkcje na dany temat. Aby lepiej to wyjaśnić załóżmy, że mamy do stworzenia system newsów. Jeśli dotychczas nie kodowałeś obiektowo to większość kodu odpowiadającego za np. dodanie, zaktualizowanie i usunięcie newsa podzieliłbyś na funkcje. Tworząc kod obiektowo masz możliwość uporządkowania zmiennych i funkcji, które mają pełnić daną rolę. Wróćmy do naszego przykładu, czyli jak uporządkować kod tworzący system newsów. Zanim jednak zaczniemy wróćmy jeszcze na chwilę do zmiennych i funkcji w klasach, ponieważ nie będziemy od tej chwili nazywać ich zmiennymi i funkcjami, a właściwościami i metodami.

Zatem jak w końcu uporządkować kod odpowiadający za newsy? Utworzymy klasę News zawierającą odpowiednie właściwości i metody.

Klasa News

<?php

    class News {

    public $dbh;

    public function add() {
        
    }

    public function edit($id) {
        
    }

    public function remove($id) {
        
    }

}
Od razu kod jest czytelniejszy niż skrypt pomieszany z funkcjami i zmiennymi, a nawet kodem HTML. Na tym etapie wspomnę, że nazwy klas piszemy z dużej litery, oczywiście nie jest to wymóg, ale tak się przyjęło. Ponadto unikaj pisania nazw klas, właściwości i metod w innym języku niż angielski - to też nie jest wymóg, ale również tak się przyjęło. Ostatnia sprawa co do nazewnictwa pól i metod i w ogóle funkcji i zmiennych nazwy powinny dokładnie odzwierciedlać co dana zmienna przechowuje, a funkcja robi.

Odwoływanie się do właściwości i metod klasy

Aby uzyskać dostęp do zdefiniowanej w klasie właściwości lub metody, konieczne jest utworzenie jej instancji, czyli inaczej pisząc - utworzenie obiektu:

$story = new News();
W PHP instancję klasy tworzy się operatorem new, a odwołanie się do właściwości lub metody możliwe jest przez operator -> - operatorem tym wskazujemy na właściwość lub metodę, do której chcemy się odwołać:
$story = new News();
$story->addNews();
Tak do właściwości i metod obiektu odwołujemy się poza obiektem, czyli nie w samej klasie. Do uzyskania dostępu do właściwości lub metody wewnątrz klasy służy specjalna zmienna $this również stosowana z operatorem ->. Zmienna ta jest referencją danego obiektu.

Konstruktor i destruktor

PHP daje możliwość utworzenia specjalnych metod, które wywoływane są, gdy tworzony i niszczony jest dany obiekt. Są to tak zwane magiczne metody, a pierwszą taką metodą jest konstruktor, a w klasie definiuje się ją nazwą __construct. Konstruktor nie może zwracać żadnej wartości, a więc nie można używać w nim instrukcji return. W konstruktorze można np. przypisać początkowe wartości jakimś właściwościom - konstruktorowi można przekazać argumenty. Metodę konstruktor przyjęło się deklarować przed innymi metodami, ale pod deklaracjami właściwości. Kolejną specjalną metodą jest destruktor. Metodę tą definiuje się nazwą __destruct. Destruktor jest wywoływany, gdy nie ma już żadnych innych referencji danego obiektu lub podczas standardowej sekwencji kończenia skryptu. Destruktor nie może zwracać żadnej wartości i nie można przekazać do niego żadnych argumentów. Rozbudujemy teraz naszą klasę News o definicję konstruktora i destruktorora:

<?php

    class News {

    public $dbh;

    public function __construct($dbh) {
        
        $this->dbh = $dbh;
    }

    public function add() {
        
    }

    public function edit($id) {
        
    }

    public function remove($id) {
        
    }

    public function __destruct() {
        
    }

}

Dostęp do właściwości i metod

Definiując właściwości i metody klasy można określić czy i jak bardzo ma być ograniczony do nich dostęp. Robi się to poprzez poprzedzenie nazwy właściwości lub klasy modyfikatorem public, protected lub private. Brak tego słowa automatycznie powoduje, że właściwość lub metoda widoczna jest wszędzie, czyli domyślnie jest publiczna. Zastosowanie modyfikatora protected powoduje, że właściwość lub metoda ma ograniczony dostęp do niej tylko w obrębie danej klasy lub klasy po niej dziedziczącej. Modyfikator private ogranicza dostęp do właściwości lub metody tylko w obrębie klasy, w której została zdefiniowana. Dodamy teraz do naszej klasy News definicje dostępu do właściwości i metod:

<?php

    class News {

    private $dbh;

    public function __construct($dbh) {
        
        $this->dbh = $dbh;
    }

    protected function add() {
        
    }

    protected function edit($id) {
        
    }

    protected function remove($id) {
        
    }

    public function __destruct() {
        
    }

}

Właściwości i metody statyczne

PHP umożliwia wywoływanie właściwości i metod klasy bez tworzenia jej instancji. Utworzenie właściwości lub metody statycznej następuje poprzez użycie modyfikatora static przed nazwą właściwości/metody. W metodzie zdefiniowanej jako statyczna nie jest dostępna zmienna $this. Do wywoływania takich właściwości i metod wewnątrz klasy służy słowo self wraz z operatorem ::, którym wskazujemy na daną właściwość lub metodę. Do wywołania właściwości lub metody statycznej poza klasą używa się zapisu NazwaKlasy::nazwaMetody();.
Przykład:

News::add_news();
lub
$news = 'News';
$news::add_news();
Zmodyfikujmy teraz naszą klasę News tak, aby zawierała właściwości i metody statyczne:
<?php

    class News {

    private $dbh;
    public static $id;

    public function __construct($dbh) {
        
        $this->dbh = $dbh;
    }

    protected static function add_news() {
        
    }

    protected static function edit_news($id) {

        self::$id = $id;
        
    }

    protected static function remove_news() {
        
    }

    public function __destruct() {
        
    }

}

Stałe

PHP umożliwia definiowanie stałych również w klasach. Stałe to jak zapewne już wiesz elementy języka PHP o podobnych właściwościach co zmienne. Stałe również przechowują jakąś wartość, z tym że jest ona stała. Stałą klasy deklaruje się poprzedzając jej nazwę słowem const, a sama nazwa stałej powinna składać się z dużych liter. PHP od wersji 5.6.0 pozwala na wyrażenie jako wartość stałej. Modyfikatory dostępu public, protected i private dla stałych dostępne są od 7.1.0. We wcześniejszych wersjach stałe są publiczne. Odwoływanie do stałej następuje na tych samych zasadach co w przypadku właściwości i metod statycznych.

<?php

    class News {

    const VERSION = '1.0';
    private $dbh;
    public static $id;

    public function __construct($dbh) {
        
        $this->dbh = $dbh;
    }

    protected static function add_news() {
        
    }

    protected static function edit_news($id) {

        self::$id = $id;
        
    }

    protected static function remove_news() {
        
    }

    public function __destruct() {
        
    }

}

echo News::VERSION;

lub


$news = new News();

echo $news::VERSION;

Autoładowanie klas

Od PHP 5.1.0 programista ma możliwość rejestrowania dowolnej ilości autoloaderów klas. Autoloader to funkcja, która ma za zadanie załadować odpowiedni plik z klasą na podstawie argumentu string $class_name, który dostępny jest w funkcji autoładującej. Do zarejestrowania takiej funkcji służy funkcja pl_autoload_register, która przyjmuje 3 argumenty: callable $autoload_function - nazwa funkcji autoładującej lub funkcja anonimowa, bool $throw - czy wyrzucić wyjątek, gdy zarejestrowanie autoload_function się nie powiedzie (domyślnie TRUE), bool $prepend - czy dołączyć autoloader do kolejki autoload (domyślnie FALSE). Jeśli zostanie ustawiona wartość TRUE autoloader zostanie wstawiony do kolejki.
Przykład:

function libraries_loader($class_name) {

    include 'libraries/' . $class_name . '.php';

}

spl_autoload_register('libraries_loader');

przykład z funkcją anonimową

spl_autoload_register(function($class_name) {

    include 'libraries/' . $class_name . '.php';

});

Klasy i metody abstrakcyjne

Język PHP pozwala na implementację klas i metod reprezentujących ogólne definicje, w przeciwieństwie do klas i metod konkretnych, które opisują już konkretny obiekt. Klasa abstrakcyjna może reprezentować np. gatunek, a klasa konkretna człowieka. Nie można utworzyć instancji takiej klasy. Metoda abstrakcyjna to metoda nieistniejąca (nie zdefiniowana), która dopiero zostanie zdefiniowana w klasie dziedziczącej. Dostęp do zdefiniowanej metody musi być taki sam jak ustalony w klasie abstrakcyjnej lub szerszy. Klasa, która implementuje choćby jedną metodę abstrakcyjną musi być abstrakcyjna.
Przykład:

<?php

    abstrakt class Content {

    abstract protected static function add();

    abstract protected static function edit($id);

    abstract protected static function remove($id);

}
Teraz klasa News, którą utworzyliśmy już wcześniej będzie dziedziczyła po klasie abstrakcyjnej Content, co wymaga zdefiniowania metod add, edit i remove.
<?php

    class News extends Content {

    private $dbh;

    public function __construct($dbh) {
        
        $this->dbh = $dbh;
    }

    protected function add() {

    }

    protected function edit($id) {

    }

    protected function remove($id) {

    }

    public function __destruct() {
        
    }

}

Zobacz też artykuł PHP klasy abstrakcyjne.

Komentarze

Popular

[HTML] Jak wstawić obrazek?

[C++] Jak obliczyć pole i obwód trapezu?

[PHP] Jak pobrać adres strony?