Metody i właściwości klasy

Metody i właściwości klas w PHP

Potrafisz już napisać prostą klasę i dodać do niej kilka publicznych pól. Wiesz, jak stworzyć obiekt danej klasy i dostać się do wartości dla konkretnych pól w obiekcie.

Jednak klasy to nie tylko zbiór pól.

Klasa może definiować własne metody, które działają identycznie jak funkcje w zwykłym, proceduralnym podejściu do programowania.

Tworząc obiekt danej klasy dostajesz dostęp do korzystania z jej metod.

Jak tworzyć metody w klasie

Zobacz poniższy przykład tworzenia metod wewnątrz klasy:

<?php

class Samochod {
  public $marka;
  public $model;
  public $iloscPaliwa = 50;
  public $spalanie = 7;

  public function tankuj($ileLitrow) {
    $this->iloscPaliwa += $ileLitrow;
  }

  public function ilePrzejedzie() {
    if (empty($this->spalanie))
      return 0;

    return $this->iloscPaliwa / $this->spalanie * 100;
  }
}

Jak widzisz, na pierwszy rzut oka, metody klas mogą zarówno zwracać wartość jak i przyjmować argumenty. Działają identycznie jak funkcje, z tą dodatkową różnicą, że posiadają dostęp do wewnętrznych pól danej klasy.

By dostać się do pola w konkretnym obiekcie, na którym wykonuje się metodę, musisz skorzystać ze zmiennej $this, która reprezentuje obiekt tej klasy.

Tym sposobem $this->model zwróci model tej konkretnej instancji klasy. Zobacz przykład:

<?php
class Samochod {
  public $marka;
  public $model;

  public function pobierzModel() {
    return $this->model;
  }
}

$opelAstra = new Samochod();
$opelAstra->model = 'Astra';

$opelInsignia = new Samochod();
$opelInsignia->model = 'Insignia';

echo $opelAstra->pobierzModel();
//wyświetli Astra

echo $opelInsignia->pobierzModel();
//wyświetli Insignia
?>

Właściwości klasy

Właściwości klasy, bardziej znane pod angielską nazwą Properties, to opakowane pola klas metodami do pobierania i nadawania wartości.

Domyślnie właściwość opakowujemy dwoma metodami:

Get – służy do pobrania wartości.

Set – służy do nadania wartości.

Zobacz poniższy przykład:

<?php
class Samochod {
  public $model;

  public function getModel() {
    return $this->model;
  }

  public function setModel($model) {
    $this->model = $model;
  }
}

$samochod = new Samochod();
$samochod->setModel('Astra');
echo $samochod->getModel();
//wyświetli Astra
?>

Zapytasz zapewne:

Po co to wszystko, skoro mogę bezpośrednio przypisywać i pobierać wartość z pola model?

Otóż nie jest to dobra praktyka, by odnosić się bezpośrednio do pól klasy.

Chcesz zapewnić, by Twój program zawsze działał dobrze i był przygotowany na różne ewentualności. PHP nie jest silnie typowanym językiem, co oznacza, że możesz np. przypisać jakiś ciąg znaków do zmiennej, która miała być liczbą. Może to zepsuć całe działanie Twojej klasy.

Weźmy przykład z obliczaniem spalania. Jeśli w miejscu spalania przypiszesz głupią wartość, np. „abcde”, klasa postara się dokonać dzielenia przez string „abcde”. Taki string zrzutowany na liczbę daje zero, co w efekcie zakończy się błędem dzielenia przez zero.

Twoim zadaniem jest maksymalne ograniczenie potencjalnego ryzyka wystąpienia nieprawidłowego stanu obiektu.

Wartości w polach obiektu świadczą o pewnym stanie. Jeśli stan ten jest prawidłowy, metody wykonują się normalnie i obiekty mogą zachodzić w właściwą interakcję z pozostałym kodem PHP. Jeśli jednak któreś z pól ma niewłaściwą wartość, zwróci błędne dane w dalszej interakcji lub, co gorsza, wysypie cały skrypt.

Dlatego zobacz, jak możesz zapewnić prawidłowość danych w właściwościach:

<?php
class Samochod {
  public $model;
  public $iloscPaliwa = 10;
  public $spalanie = 5;

  public function getSpalanie() {
    return $this->spalanie;
  }

  public function setSpalanie($spalanie) {
    $wartoscSpalania = intval($spalanie);
    if ($wartoscSpalania > 0 && $wartoscSpalania < 100)
      $this->spalanie = $wartoscSpalania;
  }

  public function ilePrzejedzie() {
    return $this->iloscPaliwa / $this->spalanie * 100;
  }
}

$samochod = new Samochod();
$samochod->setSpalanie ('abcde');
echo $samochod->ilePrzejedzie();
//wyświetli 200

$samochod->spalanie = 'abcde';
echo $samochod->ilePrzejedzie();
//zwroci błąd dzielenia przez zero i wysypie skrypt
?>

W pierwszym przypadku, gdy skorzystaliśmy z właściwości SET, stan obiektu został poprawny mimo głupich danych. Mogliśmy bezpiecznie wykonać metodę obiektu i otrzymaliśmy wynik.

W drugim przypadku przypisaliśmy nieprawidłowe dane bezpośrednio do pola. Niestety, tym razem wysypał się cały program, gdyż próbowaliśmy dokonać dzielenia przez zero.

Po co pisać metody get i set skoro pole i tak może zostać zmienione?

No właśnie.

Póki co wszystkie pola i metody tworzyliśmy jako publiczne. Stąd słowo kluczowe public przy każdej z nich.

Słowo public to tzw. modyfikator dostępu, który określa widoczność pola dla kodu spoza klasy.

W następnej lekcji dowiesz się, czym są modyfikatory dostępu i jak ukryć pole klasy przed ingerencją z zewnątrz.

Dzięki tej lekcji potrafisz już:

  • stworzyć metodę klasy
  • zwrócić wartość i przekazać argumenty
  • korzystać ze zmiennej $this
  • tworzyć właściwości

Teraz czas na poznanie modyfikatorów dostępu, które pomogą Ci zachować prawidłowy stan obiektu przez cały czas jego używania. Zapraszam!

Spis lekcji w programowaniu obiektowym

Poprzednia lekcja: Klasy i obiekty Następna lekcja: Modyfikatory dostępu