← Lekcje
PHP · lekcja 13

Programowanie obiektowe 1/3: klasa, obiekt, właściwości

Dzisiaj zaczynacie nowy temat:

  1. Programowanie obiektowe (ang. Object-Oriented Programming, w skrócie OOP) - nowy sposób organizowania kodu
  2. Dwa nowe pojęcia: klasa (szablon) i obiekt (egzemplarz zrobiony według szablonu)
  3. Nowe słowo kluczowe new i zmienna $this
  4. Ćwiczenie: class-product.php z klasą Product i dwoma obiektami
Rozgrzewka · 3 minuty

Rozgrzewka: funkcje wbudowane

  1. Ile wynosi round(4.5), a ile round(4.49)?
  2. Co pokazuje var_dump(), czego nie pokazuje zwykłe echo?
  3. Jak zapisać dzisiejszą datę w formacie dzień.miesiąc.rok za pomocą date()?
Część 1 · Klasa i obiekt

Klasa i obiekt: szablon i egzemplarz

Klasa to szablon: opisuje, jakie właściwości (dane) i metody (czynności) będzie mieć obiekt. Obiekt to konkretny egzemplarz zrobiony według tego szablonu. To jak przepis kulinarny (klasa) i ciasto upieczone z tego przepisu (obiekt): przepis jest jeden, ciast może być wiele, każde z innym smakiem.

class Product public $name; public $price; szablon (bez wartości) new Product() new Product() $product1 name = "Keyboard" price = 120 $product2 name = "Mouse" price = 45 dwa obiekty, własne wartości
PHP Manual: „Basic class definitions begin with the keyword class, followed by a class name, followed by a pair of curly braces which enclose the definitions of the properties and methods belonging to the class” · php.net/manual/en/language.oop5.basic.php
Część 2 · Deklaracja klasy i new

class i new: definicja i tworzenie obiektu

class Product {
    public $name;
    public $price;
}

$product1 = new Product();
$product1->name = "Keyboard";
$product1->price = 120;

echo $product1->name . " - " . $product1->price;
// Keyboard - 120

Nazwa klasy zaczyna się wielką literą (Product, nie product) - to konwencja PHP, nie wymóg języka, ale trzymają się jej wszystkie duże projekty.

Ciekawostka z PHP Manual: pierwsze wsparcie dla klas i obiektów PHP dostało już w wersji 3.0 z 1998 roku. Model, którego uczycie się dzisiaj, pochodzi dopiero z PHP 5 z lipca 2004 roku - to wtedy język dostał nowy silnik (Zend Engine 2.0) z dużo pełniejszym programowaniem obiektowym.

PHP Manual: „To create an instance of a class, the new keyword must be used” · php.net/manual/en/language.oop5.basic.php · ciekawostka: PHP Manual, History of PHP · php.net/manual/en/history.php.php
Część 3 · Metoda i $this

$this: wskaźnik na bieżący obiekt

class Product public $name; public $price; function showInfo() { echo $this->name . $this->price; } $this = obiekt, który wywołał metodę $product1->showInfo() name = "Keyboard" price = 120 wewnątrz metody $this wskazuje właśnie tutaj
$product1->showInfo();  // Keyboard kosztuje 120 zl
PHP Manual: „The pseudo-variable $this is available when a method is called from within an object context. $this is the value of the calling object” · php.net/manual/en/language.oop5.basic.php
Część 4 · Niezależne obiekty

Dwa obiekty, dwie niezależne wartości

oba obiekty z tej samej klasy Student $student1 name = "Ania" obiekt klasy Student $student2 name = "Kuba" obiekt klasy Student

Zmiana $student1->name nie zmienia $student2->name - każdy obiekt trzyma własną kopię właściwości.

PHP Manual: właściwości obiektu, language.oop5.basic.php · php.net/manual/en/language.oop5.basic.php
Egzamin INF.03

Tak pytają na egzaminie

1. Instrukcja języka PHP tworząca obiekt point dla zdefiniowanej w ramce klasy Point ma postać

class Point { public $x;
               public $y; }
  1. point Point;
  2. point = new Point( );
  3. point Point( );
  4. Point( ) point;

2. Które stwierdzenie najlepiej opisuje klasę Fruit zdefiniowaną w języku PHP i przedstawioną na listingu?

class Fruit {
  public $name;
  private $color;
  function setName($name) {
    $this->name = $name;
  }
}
  1. Ma jedno pole i dwie metody, z czego jedna metoda ma zakres prywatny.
  2. Ma dwa pola i jedną metodę, pole color ma zakres widzialności ograniczony tylko do metod klasy.
  3. Ma dwa pola i jedną metodę, pole name ma zakres widzialności ograniczony tylko do metod klasy.
  4. Ma dwa pola i jeden konstruktor, oba pola mają zakres widzialności ograniczony tylko do metod klasy.
CKE, E.14, wrzesień 2014, zadanie 27 · CKE, EE.09, czerwiec 2021, zadanie 5 (bank pytań, przedmiot strony, temat php)
Ćwiczenie przy komputerze · 20 minut

Ćwiczenie: class-product.php

  1. W folderze swojego serwera (np. htdocs) utwórz plik class-product.php.
  2. Zdefiniuj class Product z dwiema właściwościami: public $name; i public $price;.
  3. Utwórz dwa obiekty przez new Product() i ustaw dla każdego inne wartości $name i $price.
  4. Wypisz echo nazwę i cenę obu obiektów, każdy w osobnej linii.
  5. Sprawdź w przeglądarce pod localhost/class-product.php - mają się pojawić dwie linie.

Ma się pojawić: dwie linie z nazwą i ceną, po jednej na obiekt, np. Keyboard - 120 i Mouse - 45 - Twoje wartości mogą być inne.

Zasady pracowni
Na koniec

Sprawdź się

  1. Czym różni się klasa od obiektu?
  2. Do czego służy słowo kluczowe new?
  3. Co oznacza $this wewnątrz metody klasy?

To była pierwsza lekcja tematu programowania obiektowego - na następnej: konstruktor i destruktor.

Poza szkołą

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
Klasa nazwana Product - wielka litera na początku każdego słowaStandard PSR-1 (zalecenie, jak pisać kod PHP, żeby wyglądał podobnie w każdym projekcie): „Class names MUST be declared in StudlyCaps” - tej konwencji trzymają się Laravel, Symfony i większość frameworków PHP.nadal w użyciu
Właściwości public, dostępne wprost z zewnątrzW większych projektach właściwości częściej są private/protected, z dostępem przez metody - to temat kolejnej lekcji tej serii.nadal w użyciu (obie metody, zależnie od potrzeby)
Obiekty tworzone ręcznie przez new w kodzieW dużych aplikacjach obiekty często tworzy kontener wstrzykiwania zależności (framework sam wywołuje new w odpowiednim miejscu), zamiast ręcznego new wszędzie.nadal w użyciu (obie metody, zależnie od skali)
PHP-FIG: „Class names MUST be declared in StudlyCaps” · php-fig.org/psr/psr-1/