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.

Kurs php – Jak wczytać dane z bazy danych

W dzisiejszej lekcji kursu php, będziemy wczytywać informacje z bazy danych. Jest to dość ważny aspekt działania każdego, szanującego się serwisu internetowego. Chcę abyś zrozumiał, jak to działa, a nie tylko bezmyślnie klepał kod 🙂

Dobrze abyś przed tą lekcją, zapoznał się z czterema pierwszymi lekcjami programowania obiektowegoBędziemy go używać, gdyż obecne aplikacje, pisze się obiektowo. Programowanie strukturalne niech zostanie tam gdzie jego miejsce, czyli na lekcjach w technikum.

Zacznij od utworzenia w phpmyadmin bazy danych o nazwie blog. Wejdź do bazy danych i do zakładki sql przekopiuj kod, który utworzy potrzebną nam dzisiaj tabelę z postami. Kliknij przycisk wykonaj. Właśnie według kod sql, została utworzona tabela „posts”!

CREATE TABLE IF NOT EXISTS `posts` (
`id` int(6) unsigned NOT NULL AUTO_INCREMENT,
`contents` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`title` varchar(150) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
`data` date NOT NULL,
`author` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;

INSERT INTO `posts` (`id`, `contents`, `title`, `data`, `author`) VALUES
(1, 'Przykładowy tekst', 'Programowanie obiektowe jest łatwe', '2016-03-17', 'Admin');

Jeśli chcesz wiedzieć, co oznaczają te polecenia, większość opisałem tutaj : http://www.prosteprogramowanie.pl/mysql/mysql-podstawowe-komendy-zapytania-polecenia-itp/ Nie zniechęcaj się! Nie ucz się ich na pamięć! Pisanie ich przyjdzie Ci z czasem 🙂

Czas na kodowanie:

Zaczynamy od utworzenia połączenia, tak jak w poprzedniej lekcji. Tworzymy obiekt typu mysqli i podajemy mu dane bazy:

$connection = new mysqli('localhost','root','','blog');

Chcemy pobrać wszystkie dane z tabeli posts.  Tworzymy więc zmienną do której trafi rezultat zapytania oraz wywołujemy zapytanie, przy pomocy funkcji query(): Funkcje ta należy do każdego obiektu typu mysqli. To właśnie takim obiektem jest $connection, gdyż powstał według klasy mysqli. Wywołujemy więc ją z tego obiektu.

$result = $connection->query("SELECT * FROM POSTS");

Mówi ono bazie: „Wybierz wszystko z tabeli posts”. Gwiazdka znaczy wszystko :).

No dobrze, podglądnij teraz z ciekawości co jest w zmiennej $result za pomocą funkcji print_r();

print_r($result);

Jak widzisz, nie znalazłeś tam nic, czego byś oczekiwał. Aby otrzymać czyste dane z bazy, np. w formie tablicy, trzeba zrobić coś jeszcze. Dane takie możemy pobrać np. w formie tablicy asocjacyjnej. Jest to tablica, której indeksy są nazwami kolumn tabeli. Jest to raczej najbardziej intuicyjny sposób, aby potem się do nich odwoływać.

Użyjemy więc funkcji fetch_assoc(), którą posiada obiekt $result. Jest on obiektem który powstał według klasy mysqli_result, podczas tworzenia zapytania. Jak widać, nie musieliśmy używać słówka new, wszystko zrobiło się samo 🙂

print_r($result->fetch_assoc());

Możemy to zapisać gdzieś np.

$tablicaAsocjacyjna = $result->fetch_assoc();

Jak widać teraz mamy już konkretne dane, w formie tablicy. Na zadanie domowe, wiedząc już czym jest tablica, użyj kodu z dzisiejszej lekcji. Dodaj go do kodu z 4 lekcji programowania obiektowego. Wrzuć dane z tablicy asocjacyjnej do obiektu typu post, za pomocą setterów, tak aby wszystko ładnie się wyświetlało. Powodzenia! 🙂

Kod końcowy tej lekcji:

 $connection = new mysqli('localhost','root','','blog');
$result = $connection->query("SELECT * FROM POSTS");
$tablicaAsocjacyjna = $result->fetch_assoc();
print_r($tablicaAsocjacyjna);

 

 

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>