MVC w PHP

MVC (Model-View-Controller) jest popularnym wzorcem projektowym w programowaniu, który pomaga oddzielić logikę biznesową od warstwy prezentacyjnej. Jest to szczególnie przydatne w przypadku tworzenia aplikacji internetowych, gdzie połączenie warstwy biznesowej z interfejsem użytkownika jest niezbędne.

W PHP MVC, aplikacja jest dzielona na trzy główne elementy: model, widok i kontroler. Każdy z tych elementów pełni specyficzną rolę i jest odpowiedzialny za określone zadania.

Model Model jest odpowiedzialny za logikę biznesową aplikacji. Zawiera on dane i metody, które pozwalają na zarządzanie tymi danymi. W PHP MVC, modele zwykle reprezentują tabele w bazie danych lub po prostu struktury danych, które są przechowywane w aplikacji. Modele zapewniają interfejs między aplikacją a bazą danych i umożliwiają łatwe pobieranie i zapisywanie danych.

Widok Widok to element, który odpowiada za prezentację danych użytkownikowi. W PHP MVC widoki są zwykle plikami HTML, które są renderowane w oparciu o dane, które zostały pobrane z modelu. Widoki wyświetlają dane w formie, która jest zrozumiała dla użytkownika końcowego. W PHP MVC, widoki są oddzielone od reszty aplikacji, co pozwala na łatwe tworzenie i modyfikowanie interfejsu użytkownika bez ingerowania w kod aplikacji.

Kontroler Kontroler to element, który odpowiada za przetwarzanie żądań użytkownika i wywoływanie odpowiednich akcji w modelu i widoku. Kontrolery są odpowiedzialne za przetwarzanie formularzy, obsługę żądań AJAX i wiele innych zadań związanych z interakcją z użytkownikiem. Kontrolery zwykle odbierają żądania HTTP i wywołują odpowiednie metody w modelu, aby pobrać lub zaktualizować dane, a następnie renderują odpowiedni widok, który prezentuje te dane użytkownikowi.

Podsumowanie W PHP MVC, oddzielenie logiki biznesowej od warstwy prezentacyjnej jest kluczowe dla tworzenia skalowalnych i łatwych do utrzymania aplikacji internetowych. Model odpowiada za zarządzanie danymi, widok odpowiada za prezentację tych danych użytkownikowi, a kontroler odpowiada za przetwarzanie żądań użytkownika i wywoływanie odpowiednich akcji w modelu i widoku. Dzięki temu wzorcowi projektowemu, programiści są w stanie tworzyć aplikacje internetowe, które są łatwe w utrzymaniu i modyfikacji, a jednocześnie zapewniają użytkownikom łatwy dostęp do danych i interfejsu użytkownika.

Metody statyczne – obiektowy odpowiednik funkcji

Metody statyczne w językach programowania obiektowego, takich jak PHP, można uznać za obiektowy odpowiednik funkcji. Jednakże, istnieją pewne różnice pomiędzy metodami statycznymi a zwykłymi funkcjami.

Metody statyczne są zdefiniowane w obrębie klasy i mogą mieć dostęp do innych metod i właściwości statycznych klasy, bez potrzeby tworzenia obiektu. Mogą one również działać na danych statycznych, które są współdzielone pomiędzy wszystkimi instancjami klasy.

Z drugiej strony, funkcje są zdefiniowane poza klasami i nie mają dostępu do metod ani właściwości klasy. Funkcje mogą działać na zmiennych globalnych lub lokalnych.

Mimo to, metody statyczne często mają podobne zastosowania do funkcji, np. w celu wykonania określonej operacji, bez potrzeby tworzenia instancji klasy. Jednakże, w przypadku gdy operacja wymaga dostępu do danych instancji klasy, niezbędne może okazać się użycie zwykłych metod klasy.

Podsumowując, metody statyczne mogą być postrzegane jako obiektowy odpowiednik funkcji, jednakże istnieją między nimi pewne różnice w zakresie ich dostępności i sposobu ich działania.

Fatal error: Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods

Błędy programistyczne są nieuniknione podczas tworzenia oprogramowania. Jednym z częstych błędów, które pojawiają się w językach programowania zorientowanych obiektowo, jest błąd „Fatal error: Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods”.

Ten błąd pojawia się wtedy, gdy klasa zawiera co najmniej jedną abstrakcyjną metodę, ale nie została zadeklarowana jako klasa abstrakcyjna lub nie zaimplementowano pozostałych metod abstrakcyjnych w klasie dziedziczącej.

Abstrakcyjne metody to takie, które nie posiadają implementacji w klasie bazowej i wymagają implementacji w klasach dziedziczących. Dzięki temu programista może zdefiniować metody, które muszą być zaimplementowane przez każdą klasę dziedziczącą, ale nie musi tworzyć implementacji dla każdej klasy dziedziczącej. Abstrakcyjne metody są szczególnie przydatne w przypadku tworzenia hierarchii klas, gdzie istnieje wspólny zestaw metod dla wszystkich klas dziedziczących.

Aby rozwiązać ten błąd, należy zadeklarować klasę jako abstrakcyjną lub zaimplementować brakującą metodę abstrakcyjną w klasie dziedziczącej. Istnieją dwie możliwości rozwiązania problemu:

  1. Zadeklaruj klasę jako abstrakcyjną:
abstract class Pojazd {
  // Deklaracja abstrakcyjnej metody
  abstract public function jedz();
}

class Samochod extends Pojazd {
  // Implementacja metody jedz() w klasie dziedziczącej
  public function jedz() {
    // kod
  }
}

W tym przypadku klasa Pojazd została zadeklarowana jako abstrakcyjna, co oznacza, że nie można tworzyć instancji tej klasy. Jednakże, klasa dziedzicząca Samochod zaimplementowała brakującą metodę abstrakcyjną jedz().

  1. Zaimplementuj brakującą metodę abstrakcyjną w klasie dziedziczącej:
abstract class Pojazd {
  // Deklaracja abstrakcyjnej metody
  abstract public function jedz();
}

class Samochod extends Pojazd {
  // Implementacja metody jedz() w klasie dziedziczącej
  public function jedz() {
    // kod
  }
}

// Utworzenie instancji klasy Samochod
$samochod = new Samochod();

W tym przypadku klasa Pojazd została zadeklarowana jako abstrakcyjna, ale nie zaimplementowano metody jedz() w tej klasie. Zamiast tego, klasa dziedzicząca Samochod zaimplementowała brakującą metodę jedz() i dzięki temu można utworzyć instancję klasy Samochod. W ten sposób zapewnia się, że wszystkie abstrakcyjne metody zdefiniowane w klasie bazowej są zaimplementowane w klasie dziedziczącej.

Ważne jest, aby pamiętać, że abstrakcyjne metody są tylko deklaracją, a nie implementacją. Oznacza to, że nie można tworzyć instancji klasy abstrakcyjnej, a jedynie klasy dziedziczącej po niej. Wszystkie abstrakcyjne metody muszą być zaimplementowane w klasie dziedziczącej przed utworzeniem instancji tej klasy.

Podsumowując, błąd „Fatal error: Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods” pojawia się wtedy, gdy klasa zawiera co najmniej jedną abstrakcyjną metodę, ale nie została zadeklarowana jako klasa abstrakcyjna lub nie zaimplementowano pozostałych metod abstrakcyjnych w klasie dziedziczącej. Aby rozwiązać ten błąd, należy zadeklarować klasę jako abstrakcyjną lub zaimplementować brakującą metodę abstrakcyjną w klasie dziedziczącej. Pamiętaj również, że abstrakcyjne metody są tylko deklaracją, a nie implementacją, i że nie można tworzyć instancji klasy abstrakcyjnej, a jedynie klasy dziedziczącej po niej.

Wprowadzenie do OOP w PHP

Programowanie obiektowe

Obecnie większość programistów korzysta z podejścia obiektowego do programowania, a programowanie obiektowe stało się jednym z najważniejszych trendów w branży informatycznej. PHP jest jednym z języków programowania, które wspiera programowanie obiektowe, a wraz z wydaniem w 2004r. wersji PHP 5, stało się to jeszcze bardziej widoczne. W tym artykule przedstawimy wprowadzenie do programowania obiektowego w PHP.

Czym jest programowanie obiektowe?

Programowanie obiektowe (OOP) to sposób tworzenia programów, który polega na modelowaniu rzeczywistych obiektów jako obiektów w programie. Programowanie obiektowe skupia się na obiektach i ich interakcjach ze sobą, zamiast na procedurach i funkcjach, co jest charakterystyczne dla programowania proceduralnego. W programowaniu obiektowym, programy składają się z obiektów, które są instancjami klas, a te z kolei definiują cechy i zachowania tych obiektów.

Klasy i obiekty w PHP

W PHP, klasa jest definiowana za pomocą słowa kluczowego „class” i może zawierać zmienne (nazywane właściwościami) oraz metody (funkcje). Klasa może być uważana za szablon do tworzenia obiektów. Obiekt jest instancją klasy, co oznacza, że jest to konkretny egzemplarz klasy, który może mieć swoje własne wartości dla właściwości i wykonuje metody klasy.

Przykład definiowania klasy i tworzenia obiektu

class Person {
  public $name;
  public $age;

  public function __construct($name, $age) {
    $this->name = $name;
    $this->age = $age;
  }

  public function greet() {
    echo "Hello, my name is " . $this->name . " and I am " . $this->age . " years old.";
  }
}

$person = new Person("John", 30);
$person->greet();

W powyższym przykładzie definiujemy klasę „Person„, która ma dwie właściwości – „name” i „age„, a także dwie metody – „__construct” i „greet„. Metoda „__construct” jest specjalną metodą, która jest wywoływana automatycznie, gdy tworzony jest nowy obiekt. Metoda ta ustawia wartości właściwości „name” i „age” dla danego obiektu. Metoda „greet” jest prostą metodą, która wyświetla powitanie z użyciem właściwości „name” i „age” danego obiektu.

Po zdefiniowaniu klasy, możemy stworzyć nowy obiekt, używając słowa kluczowego „new„. W tym przypadku tworzymy nowy obiekt „Person” o imieniu „John” i wieku „30„, a następnie wywołujemy metodę „greet” dla tego obiektu, która wyświetli powitanie z użyciem właściwości „name” i „age„.

Dziedziczenie klas w PHP

Dziedziczenie klas to jeden z najważniejszych konceptów w programowaniu obiektowym, który pozwala na tworzenie hierarchii klas, w których jedna klasa dziedziczy właściwości i metody z innej klasy, nazywanej klasą bazową lub nadrzędną. Dziedziczenie umożliwia tworzenie bardziej złożonych struktur klas, w których każda klasa może mieć swoje unikalne cechy, ale jednocześnie dziedziczyć zachowania i cechy od klasy bazowej.

Przykład dziedziczenia klas w PHP:

class Animal {
  public $name;
  public $sound;

  public function __construct($name, $sound) {
    $this->name = $name;
    $this->sound = $sound;
  }

  public function makeSound() {
    echo $this->name . " says " . $this->sound;
  }
}

class Dog extends Animal {
  public function __construct($name) {
    parent::__construct($name, "woof");
  }
}

$dog = new Dog("Buddy");
$dog->makeSound();

W powyższym przykładzie definiujemy klasę „Animal„, która ma dwie właściwości – „name” i „sound”, a także dwie metody – „__construct” i „makeSound„. Metoda „__construct” ustawia wartości właściwości „name” i „sound” dla danego obiektu. Metoda „makeSound” wyświetla dźwięk zwierzęcia z użyciem właściwości „name” i „sound„.

Następnie definiujemy klasę „Dog„, która dziedziczy po klasie „Animal„. Klasa „Dog” ma tylko jedną właściwość – „name„, ponieważ „sound” jest dziedziczony z klasy „Animal„. Klasa „Dog” ma również specjalną metodę „__construct„, która wywołuje metodę „__construct” z klasy „Animal” z wartością „woof” dla właściwości „sound„.

Na końcu tworzymy nowy obiekt „Dog” o imieniu „Buddy” i wywołujemy metodę „makeSound„, która wyświetli dźwięk psa z użyciem właściwości „name” i „sound„.

Podsumowanie

Wprowadzenie do programowania obiektowego w PHP pokazuje, jak programować z wykorzystaniem klas i obiektów, dziedziczenia klas i innych konceptów programowania obiektowego. Programowanie obiektowe umożliwia tworzenie bardziej złożonych programów, które są bardziej modularne i łatwiejsze do zrozumienia i utrzymania. PHP jest językiem programowania, który wspiera programowanie obiektowe, a wprowadzenie do programowania obiektowego w PHP może pomóc programistom w zrozumieniu podstawowych konceptów i technik programowania obiektowego w PHP.

Niezależnie od tego, czy programujesz w PHP czy w innych językach programowania obiektowego, ważne jest, aby zrozumieć podstawowe koncepty i techniki programowania obiektowego. Programowanie obiektowe może pomóc w tworzeniu bardziej złożonych programów, które są łatwiejsze do zrozumienia i utrzymania.

W PHP programowanie obiektowe jest szeroko stosowane, zwłaszcza w tworzeniu aplikacji internetowych i stron internetowych. Wielu programistów PHP używa frameworków takich jak Laravel, Symfony i CakePHP, które opierają się na programowaniu obiektowym i oferują narzędzia i funkcje, które ułatwiają programowanie z użyciem klas i obiektów.

Ważne jest, aby zacząć od nauki podstawowych konceptów programowania obiektowego, takich jak klasy, obiekty i dziedziczenie klas. Następnie można przejść do bardziej zaawansowanych technik, takich jak polimorfizm, abstrakcja i interfejsy. Pamiętaj również, że programowanie obiektowe to tylko jedna z wielu technik programowania, a dobre rozwiązanie programistyczne wymaga odpowiedniego użycia różnych technik i narzędzi w zależności od wymagań projektu.

Wprowadzenie do programowania obiektowego w PHP to tylko początek. Istnieją setki książek, kursów i tutoriali, które pomogą w pogłębianiu wiedzy na temat programowania obiektowego i jego zastosowań w PHP. Ważne jest, aby kontynuować naukę i eksperymentować z różnymi technikami, aby stać się lepszym programistą.

PHP na Codespaces

Github Codespaces to bardzo ciekawa oferta środowiska programistycznego w chmurze. By zacząć w nim pracę, wystarczy podczas przeglądania repozytorium na Githubie zmienić końcówkę adresu github.com na github.dev i już będziemy mieli otwarte okno z przeglądarkową wersją VSCode z otwartym danym repozytorium. To jeszcze nie to! Na razie mamy edytor, by móc uruchamiać kod musimy przejść/ uruchomić tytułowe Codespaces, co można osiągnąć wciskając CTRL+Shift+P, a następnie wpisując ciąg Codespaces i wybierając opcję Codespaces: Create new Codespace i interesujące nas repozytorium.

VSCode: Github Codespaces


Jeśli mamy do czynienia z kodem PHP to odpalimy go, wpisując w terminalu, domyślnie widocznym w dolnej części okna aplikacji, następującą komendę uruchamiającą wbudowany w PHP serwer HTTP:

php -S 127.0.0.1:8000 -t /workspaces/fs

VSCode powinien wykryć uruchomienie serwera i wyświetlić komunikat umożliwiający otworzenie naszej działającej strony PHP. Spokojnie – ten podgląd, przynajmniej w przypadku prywatnych repozytoriów, jest zabezpieczony hasłem, by nikt nie wbił nam się na serwer podczas pisania kodu.

Dla domyślnego kontenera PHP & Mariadb dane do logowania do bazy MySQL to:
host: 127.0.0.1 (localhost z jakiegoś powodu nie przechodzi)
użytkownik: root
hasło: mariadb

Życzę owocnej pracy!