Archiwum kategorii: programowanie obiektowe

5. Dziedziczenie w programowaniu obiektowym

Dzisiaj nasz kurs programowania pozwoli Ci zgłębić bardzo ciekawy i użyteczny temat, jakim jest dziedziczenie. W programowaniu obiektowym pozwala ono utworzyć część klasy na podstawie innej, wcześniej utworzonej klasy. W Poprzednich lekcjach, tworzyliśmy klasę Post, która posiadała zmienne: $autor, $tytuł oraz $tresc. Nie jest to lekcja dla całkowicie początkujących. Musisz już coś wiedzieć z poprzednich lekcji.

Pod naszym postem, przydałyby się komentarze. Co musimy zrobić aby ten o to pomysł przelać na kod? Uczyłeś się przez ostatnie kilka lekcji programowania obiektowego, więc wiesz już, że wszystko składa się z obiektów, które powstały na podstawie klas.

Dziedziczenie jest tym, co nam dzisiaj pomoże utworzyć klasę minimalnym wysiłkiem. Moglibyśmy stworzyć klasę komentarz. Zawierałaby ona zmienne $autor, $tresc, i można by też, dołożyć zmienną przechowującą datę, czyli $data. Zauważ, zmienne $autor i $tresc, znajdują się także w klasie Post.

Możemy więc stworzyć klasę Komentarz, na podstawie klasy Post. Wtedy zmienne, które istnieją na planie obiektu typu Post, czyli w klasie, zostaną „Przekopiowane” do klasy Komentarz.

Aby to wykonać, musimy użyć słowa extends zaraz po nazwie deklarowanej klasy. Mówimy więc językiem programowania „Klasę Komentarz, rozszerz o Post”. Wyglądałoby to tak:

class Komentarz extends Post{

}

W tym momencie klasa Komentarz, przejęła wszystkie właściwości klasy Post. Nie są one widoczne, jednak tworząc obiekt na jej podstawie, można ich użyć. Możemy jej przypisać autora, tytuł i post. Tytuł w komentarzu nie będzie nam potrzebny, więc użyjemy tylko zmiennych z autorem i treścią. Dodamy więc tylko zmienną, przechowującą datę, gettery, settery i klasa komentarza będzie gotowa.

class Komentarz extends Post{
  private $data;

  public function getData()
  {
    return $this->data;
  }

  public function setData($data)
  {
    $this->data = $data;
  }
  
}

Jak widzisz, zamiast tworzyć trzy potrzebne nam zmienne, utworzyliśmy tylko jedną. Mamy więc trzykrotnie krótszy kod. Na to właśnie pozwala nam dziedziczenie. Używamy zmiennych i funkcji innych klas, tworząc nowe.

Na początku może Ci się to wydawać tylko małym ułatwieniem. W większych projektach jest to jednak funkcjonalność, bez której nie wyobrażam sobie pracować. Klasy nie raz mają ogromną ilość funkcji i trudno by było to kopiować.

Na zadanie utwórz jakiś komentarz według tej klasy i dodaj go do naszego kodu z klasą Post i widokiem strony, tak aby to ładnie wyglądało. Będziesz musiał trochę pomyśleć. O to właśnie chodzi w programowaniu. Pochwal się rezultatem w komentarzu.

Przećwicz to sam. Wymyśl jakąś klasę, stwórz jej zmienne, wykonaj dziedziczenie i upewnij się, że to rozumiesz.

4. Programowanie obiektowe – settery, wyświetlamy obiektowy post

Czas stworzyć funkcje, które nadają wartość zmiennym obiektu, czyli settery.  Gdy rozumiejąc zasadę działania getterów i setterów i zaczniesz je stosować, programowanie obiektowe, nie będzie już takie skomplikowane, jak się to wydaje.

Funkcja ta ma jako argument, przyjmować wartość (do nawiasów), która trafi do zmiennej klasy.  Użyjemy więc omówionego wcześniej „This” i operatora przypisania =.Będzie to wyglądać np. tak:

function ustawNazwe($_nazwa){
$this->nazwa = $_nazwa; //argument funkcji wpada do zmiennej klasy i po sprawie 🙂
}

Napisz teraz settery do reszty zmiennych sam!

Nasz klasa Post, powinna teraz wyglądać tak:

class Post{
private $nazwa;
private $tresc;
private $autor;

function pokazNazwe(){
return $this->nazwa;
}
function pokazTresc(){
return $this->tresc;
}
function pokazAutora(){
return $this->autor;
}

function ustawNazwe($_nazwa){
$this->nazwa = $_nazwa;
}
function ustawTresc($_trescMojegoSuperPostu){
$this->tresc = $_trescMojegoSuperPostu;
}
function ustawAutora($_autor){
$this->autor = $_autor;
}
}

Teraz chcemy utworzyć post, według planu jakim jest klasa i zrobić z tego coś ładnego 🙂

Aby utworzyć nowy post, musimy stworzyć nowy obiekt, typu post.

$mojNajlepszyWpis = new Post();

Teraz możemy mu przypisać odpowiednie dane, za pomocą funkcji. Funkcje wywołujemy, biorąc obiekt w postaci zmiennej np. $mojNajlepszyWpis. Dopisujemy strzałkę -> oraz nazwę funkcji. Spróbuj to zrobić sam i przejdź dalej.

Wyglądać, ma to tak:

$mojNajlepszyWpis->ustawAutora("Janusz");
$mojNajlepszyWpis->ustawNazwe("Rowerem wodnym przez Czarnogórę");
$mojNajlepszyWpis->ustawTresc("Witaj na moim blogu podróżniczym");

Dane możemy wypisać na ekran przy pomocy getterów, w dowolnej części kodu html.

<h1><?php echo $mojNajlepszyWpis->pokazNazwe(); ?></h1>
<p><?php echo $mojNajlepszyWpis->pokazTresc(); ?></p>
<b>Autor: <?php echo $mojNajlepszyWpis->pokazAutora(); ?></b>

Wiesz już w jaki sposób, nasz kod będzie działał. Teraz przydałoby się, wypisać dane na ekran, tak aby w miarę fajnie to wyglądało.

Uwaga, teraz przyda się znajomość html! Jeśli go nie znasz, to zostań przy samym wypisaniu zmiennych obiektu, za pomocą echo.

Użyjemy teraz bootstrapa. Jest to framework css. Brzmi to poważnie, jednak na początek wystarczy, abyś wiedział, że działa on jak gotowy arkusz stylów. Twoim zadaniem jest, dopisywanie tylko odpowiednich klas do znaczników w html np.  <div class="container">

Zrób tak:

  1. Pobierz bootstrapa ze strony: http://getbootstrap.com/getting-started/
  2. Rozpakuj zawartość archiwum tak aby w folderze głównym strony, znajdowały się foldery css, fonts, js. Musisz je wyciągnąć z folderu, który jest w archiwum.
  3. Przekopiuj kod podstawowego szablonu bootstrapa z http://getbootstrap.com/getting-started/#template
  4. <html lang="en">, zmień na pl

Masz już działającego bootstrapa. Kod klasy umieść między znaczkami <?php ?> nad całym kodem html. Może on się znajdować, też pod kodem. W programowaniu obiektowym nie ma to znaczenia.

W sekcji <body> skasuj nagłówek „Hello World”.

Wrzuć tam kod tworzenia obiektu Post i nadawanie wartości, czyli:

<?php
$mojNajlepszyWpis = new Post();
$mojNajlepszyWpis->ustawAutora("Janusz");
$mojNajlepszyWpis->ustawNazwe("Rowerem wodnym przez Czarnogórę");
$mojNajlepszyWpis->ustawTresc("Witaj na moim blogu podróżniczym");
?>

Jak dobrze zauważyłeś, kod php jest otwierany i zamykany nad kodem html, a także w nim. Dobrze, abyś wiedział, że możesz tak robić. Daje to możliwość wyświetlania zmiennych między znaczkami html.

Teraz stworzymy, to co oglądał będzie użytkownik. Zostając w sekcji <body>,  zrób sekcję, czyli div o klasie container. W nim umieścimy nasze elementy. Będzie to jakby główny pojemnik, na części, z których składa się strona. W nim utwórz kolejną sekcję o klasie „page-header”. W środku będzie nagłówek, wyświetlający zmienną z tytułem: <?php echo $mojNajlepszyWpis->pokazNazwe(); ?>. Zamknij sekcję z nagłówkiem i wypisz pozostałe zmienne, według własnego  uznania, tak aby wyglądało to dobrze np. tekst jako akapity.

U mnie wygląda to tak:

 <div class="container">
<div class="page-header">
<h1><?php echo $mojNajlepszyWpis->pokazNazwe(); ?></h1>
</div>
<p><?php echo $mojNajlepszyWpis->pokazTresc(); ?></p>
<b>Autor: <?php echo $mojNajlepszyWpis->pokazAutora(); ?></b>
</div>

Kod całej strony:

<?php
class Post{
private $nazwa;
private $tresc;
private $autor;

function pokazNazwe(){
return $this->nazwa;
}
function pokazTresc(){
return $this->tresc;
}
function pokazAutora(){
return $this->autor;
}

function ustawNazwe($_nazwa){
$this->nazwa = $_nazwa;
}
function ustawTresc($_trescMojegoSuperPostu){
$this->tresc = $_trescMojegoSuperPostu;
}
function ustawAutora($_autor){
$this->autor = $_autor;
}
}
?>
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<title>Bootstrap 101 Template</title>
<!-- Bootstrap -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<!--Nasz kod zaczyna się tutaj-->
<?php
$mojNajlepszyWpis = new Post();
$mojNajlepszyWpis->ustawAutora("Janusz");
$mojNajlepszyWpis->ustawNazwe("Rowerem wodnym przez Czarnogórę");
$mojNajlepszyWpis->ustawTresc("Witaj na moim blogu podróżniczym");
?>
<!--Widok Strony-->
<div class="container">
<div class="page-header">
<h1><?php echo $mojNajlepszyWpis->pokazNazwe(); ?></h1>
</div>
<p><?php echo $mojNajlepszyWpis->pokazTresc(); ?></p>
<b>Autor: <?php echo $mojNajlepszyWpis->pokazAutora(); ?></b>
</div>
<!--A tutaj kończy :)-->

<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="js/bootstrap.min.js"></script>
</body>
</html>

3. Programowanie obiektowe – funkcje klasy, gettery i this

W poprzedniej lekcji, utworzyliśmy klasę o nazwie Post, oraz jej prywatne zmienne. Brakuje nam tylko funkcji, które będą nadawać oraz pobierać wartości,  dla tych zmiennych. Utworzymy sobie tak zwane gettery i settery.

Gettery – cóż to i po co? Są to funkcje, które pozwalają pobrać z obiektu, który powstanie według klasy, wartości zmiennych. Przypominam, że klasa jest tylko planem obiektu, więc bezpośrednio z klasy, nic nie wyciągamy, raczej… chociaż w programowaniu, bywa różnie 🙂 Ale przejdźmy do konkretów:

Mamy taki oto kod, i trzeba dorobić gettery do zmiennych:

class Post{
private $nazwa;
private $tresc;
private $autor;
}

Musimy więc utworzyć trzy funkcje, dla każdej zmiennej osobno. Funkcje klasy też mogą być publiczne lub prywatne. Domyślenie jednak funkcje te są publiczne, więc nie musimy pisać słówka public przed function.

Gdy kodujesz i chcesz aby to ślicznie wyglądało, nazwą funkcji jest: get oraz nazwa zmiennej z dużej litery np, function getName(). My jednak w tej lekcji mamy polskie nazwy zmiennych, więc zamiast get napiszemy sobie „pobierz”.

Uwaga czas włączyć myślenie! Co musi robić funkcja, która ma nam wyciągnąć wartość zmiennej, z utworzonego obiektu? Pomyśl, pomyśl… Funkcja musi zwrócić wartość zmiennej. Jeśli funkcja coś zwraca, to używamy magicznego słówka, return.

„This” w programowaniu obiektowym

Nie zadziała to jednak tak łatwo jak myślisz. return $autor; w środku funkcji nie wystarczy. Oznaczałoby to, że chcemy zwrócić zmienną $autor, która byłaby zadeklarowana w środku, tej funkcji, My jednak chcemy wyciągnąć z obiektu ,jego zmienną. Tą która jest zadeklarowana na górze klasy. Służy do tego słówko $this->, po którym piszemy nazwę zmiennej. Oznacza ono, że odwołujemy się do zmiennej klasy.

Jak łatwo zapamiętać, co robi this?

This po prostu wskazuje na zmienną, która jest na górze klasy, a zmienne te deklarujemy właśnie tam. Wtedy wygląda to, z klasą… 🙂

Pomyśl teraz jak to powinno wyglądać… najpierw function potem nazwa, następnie nawiasy i klamry. Potrzebujemy też return, nowego słówka, czyli $this-> ze strzałką , oraz nazwy zmiennej, która jest na górze. Spróbuj to napisać 🙂

Rozwiązanie, czyli gettry dla klasy Post:

<?php
class Post{
private $nazwa;
private $tresc;
private $autor;

function pokazNazwe(){
return $this->nazwa;
}
function pokazTresc(){
return $this->tresc;
}
function pokazAutora(){
return $this->autor;
}

Settery, czyli funkcje ustawiające wartości zmiennych, przedstawię w następnej lekcji.  Pomyśl jednak sam, w jaki sposób powinny one działać. Funkcja taka musi nadawać wartość zmiennej klasy, która wprowadzona zostanie jako argument, czyli w nawiasy.

Była to kolejna lekcja, bardziej teoretyczna. Opisane sprawy jednak trzeba zrozumieć, zanim zacznie się je stosować. Często w nauce programowania obiektowego, tylko wspomina się o wskaźniku This, który „pokazuje o tam”.  Z taką wiedzą, nie jest się nawet w stanie, napisać prostego gettera. Zachęcam do napisania „setterów” analogicznie do getterów, bez pomocy google 🙂

2 Lekcja programowania obiektowego, klasa i zmienne

Dzisiaj zajmiemy się tematem, jakim w programowaniu obiektowym jest klasa. W poprzedniej lekcji klasą nazwałem plan, według którego powstanie obiekt. Obiekt ten, chociaż z zewnątrz wyglądał będzie jak zmienna, to w jego środku, znajdować się będą zmienne i funkcje. Uczyć będziemy się na klasie Post, którą opisałem wcześniej.

No to będzie się działo! Coś mi mówi że za tydzień, będziesz rzucał obiektami na prawo i lewo, zastanawiając się czy wiedzę tą, można jakoś wykorzystać, podczas rozwieszania prania na balkonie, gdyż te obiekty są takie fajne 🙂

Czas na konkrety…

Tworzenie klasy jest proste. Piszemy sobie słówko class później nazwę klasy, czyli np. Post a następnie, otwierasz i zamykasz kod klasy klamrami. Deklaracja klasy jest podobna do deklaracji funkcji, jednak nie mamy tutaj nawiasów po nazwie. Wynika to z tego, że bezpośrednio do klasy wkładać nic nie będziemy tak jak funkcji.

Wyglądać to będzie tak:

<?php

class Post{

//a tutaj będzie treść

}

?>

Mówiliśmy, że nasz post składał się będzie ze zmiennych $nazwa, $tresc i $autor. W klasie utworzymy je jako zmienne prywatne. Będą miały do nich dostęp, tylko funkcje klasy. Czyli jeśli utworzymy nowy post (czyli obiekt), według tej klasy, to jedyną możliwością edycji zmiennych tego obiektu, będzie użycie jednej z funkcji. Taką funkcją może być np. $mojPost->ustawAutora('autor777').  Napiszmy to:

class Post{

private $nazwa;
private $tresc;
private $autor;

}

Jak widać wyżej, słówko private, załatwiło sprawę. Zmienne będą dostępne tylko dla funkcji klasy. Możemy je też ustawić jako public, czyli publiczne albo protected – chronione. Użycie private, jest najbardziej zalecane i wygląda dobrze.

Na początku, gdy nie miałeś jeszcze dłuższej styczności z programowaniem, zalecam abyś budował klasy, w oparciu właśnie o zmienne prywatne. Nauczy Cię to dobrych nawyków.

Wspomniałem o zmiennych publicznych i chronionych. Zmienna publiczna to taka, do której mamy dostęp bez użycia funkcji. Bierzemy obiekt, piszemy strzałkę, potem nazwę zmiennej i ustawiamy jej wartość.

$mojPost->autor = 'Anastazja';

To w takim razie, czemu mam używać funkcji do nadawania wartości, jeśli tak jest łatwiej?

W tym wypadku nie można np. sprawdzić tego, czy nazwa autora, trafiająca do obiektu np. $mojPost jest poprawna. W funkcji ustawiającej autora możemy np. ustawić minimalną długość nazwy. Możemy też zmienić pierwszą literę na dużą.

Pisząc np. klasę która obsługuje przelewy,  lepiej abyś miał 100% pewność, że do zmiennej $numerKonta obiektu $przelew123, trafi poprawna wartość.

Kod, który napisałeś obecnie, działał będzie dopiero gdy w następnej lekcji, dodamy do niego funkcje. Nie wszystko na raz 🙂

1 Lekcja programowania obiektowego, piszemy bloga

Programowania obiektowego, będziemy uczyć się na łatwych, lecz ciekawych przykładach. Najważniejsze jest, aby zrozumieć, jak ono działa, i zacząć je stosować, w każdej możliwej sytuacji!

Czas na ostrą jazdę bez trzymanki. Wkraczamy abstrakcję, zmienne w zmiennych, funkcje które wychodzą ze zmiennych i inne cuda na kiju!Ale nie uciekaj…

…To proste!!!

Wiedzę tą radzę powoli przyswajać. Tak aby się dobrze poukładała. Zrób sobie kawę i zaczynaj!

Jeśli programujesz w innym języku niż php, ta lekcja, też jest dla Ciebie. W językach takich jak java, c++, python itp, działa to tak samo!

W poprzedniej lekcji, zacząłem pisać, coś o programowaniu obiektowym. Uznałem, że fajnie, abyś miał z tym styczność, od początku nauki. Unikniesz dzięki temu, dość bolesnej przesiadki z programowania strukturalnego, przydatnego gdy chcesz programować domofon, na programowanie obiektowe, które przydaje się, gdy rozwijasz jakiś mniejszy lub większy projekt.

Takim projektem może być blog. Jego budowę zaczniemy od pojedynczego postu, który wyświetlał będzie się na ekranie przeglądarki.

Teraz czas na krótkie wprowadzenie, czym to jest to programowanie obiektowe.

Pisząc obiektowo, jakąś część strony, zadawaj sobie pytania:

  • Z czego składa się …?
  • Co robi …?

My będziemy budować pojedynczy wpis na blogu, czyli post. 

  • Z czego składa się post?
  • Co robi post?

Pierwsze pytanie jest łatwe. Post składa się z tytułu, treści i autora. Oznaczałoby to pewnie stworzenie trzech zmiennych, do których można by, schować te dane.

Drugie pytanie… co robi post? Pomyślmy… Trzeba w nim zapisać jakieś dane (np. do zmiennych), a potem je pokazać użytkownikowi. Odczyt i zapis czyli to co zawsze. Tutaj jednak będzie ciekawiej…

Potrzebujemy więc trzech zmiennych, które przechowają nam dane, a także funkcje, które zapiszą dane do zmiennych i je pokażą. Musimy połączyć w jedną całość, te schowki na dane jakimi są zmienne, z funkcjami które będą je obsługiwać. Tak powstanie post.

Będzie to post którego schowamy sobie do jeszcze innej zmiennej… Programowanie obiektowe pozwoli nam, w jednym obiekcie, czyli zmiennej np. $slicznyPost, umieścić trzy inne zmienne, oraz  funkcje, które będą na nich pracować.

Na takim utworzonym już poście, będziemy pracować, używając  funkcji, które zawiera ten obiekt. Musimy więc stworzyć trzy funkcje ustawiające wartość zmiennej i trzy funkcje które pokazują ich zawartość. Można też stworzyć jedną dużą która ustawi wszystkie zmienne, ale to potem… 🙂

Aby zaspokoić twoją ciekawość pokażę Ci w jaki sposób, jeśli chodzi o składnię języka, będziesz używał funkcji, na obiekcie post.

$obiektTypuPost->ustawTresc("Tresc czyli wartość tekstowa, więc w apostrofach");

Jak widać, aby wywołać funkcję z obiektu, wystarczy użyć strzałki ->, a później użyć funkcji, jak w lekcjach poprzednich.

Jednak zanim będziesz tego używał, post ten musisz stworzyć. Ale jeszcze wcześniej… musimy mieć plan tego postu (nazywa się to klasa), który zawierał będzie zmienne i funkcje, których potrzebujemy. Zajmiemy się tym w następnej lekcji.