Skocz do zawartości

Kurs PHP by PanKrok - Teoria #3 Tablice, Klasy, Funkcje


Pankrok
 Udostępnij

Rekomendowane odpowiedzi

  • Ekspert
Opublikowano
Opublikowano (edytowane)

Cześć, dzisiaj zajmiemy się przyjemnymi zagadnieniami takimi jak tablice w których przechowujemy dane (które z jakiegoś powodu umknęły mi wcześniej, no nic nadrobimy dzisiaj), klasy które znacznie ułatwiają zarządzanie kodem i jego wielokrotnym wykorzystaniem.

1. Tablice

Tablica to nic innego jak specyficzna zmienna która pozwala przechowywać wiele danych w jednym miejscu, korzystaliśmy z niej już w poprzedniej części kursu. Wyobraź sobie budynek biblioteki - to będzie nasza tablica w PHP, mamy więc odpowiednie działy gdzie znajdują się odpowiednie pozycji na odpowiednich półkach z numerami, z jedną małą różnicą tutaj numerację zaczynamy od zera. Zobaczmy na poniższy przykład prostej tablicy:

<?php declare(strict_types = 1);

$arr = [1,7,5,2]; // tworzymy tablicę i przypisujemy ją do zmiennej $arr
echo $arr[0];  	  // sprawdzamy co jest na pierwszej pozycji tablicy,
echo $arr[1];     // sprawdzamy co jest na drugiej pozycji talbicy

// dodajmy kolejny element do tablicy
$arr[] = 10; // jest to alternatywny zapis dla funkcji array_push($arr, 10);
echo $arr[4]; // wyświetlamy 10

powyższy przykład jest to najprostsza tablica. Oczywiście tablice pozwalają przechowywać każdy typ zmiennej nie tylko intiger, dodatkowo mogą być one wielowymiarowe, czyli tablice w tablicy:

<?php declare(strict_types = 1);

// wielowymiarowa talbica:
$arr = [
	[5, 10, 15],
  	[1, 6, 14]
];
//żeby dostać się do danych trzeba określić ich pełne "położenie"
echo $arr[0][1]; // wyświetlimy liczbę 10

Tablice pozwalają jednak na coś o wiele wygodniejszego i fajniejszego, zamiast numeracji jako kluczy możemy użyć ciągu znaków, takie tablice nazywamy asocjacyjnymi, najlepiej zobrazuje to przykład:

<?php declare(strict_types = 1);

$arr = [
	'db' => [
    	'host' => 'sql.foo.com',
      	'user' => 'foo',
      	'password' => 'bar',
      	'databaze' => 'baz'
    ],
  	'settings' => [
      'cache' => true,
      'mode' => 'memcache',
      'lifetime' => 120,
    ]
];

//teraz dodamy kolejny element
$arr['settings']['secure'] = true;

echo $arr['db']['host']; // wyświetlimy "sql.foo.com"

taka budowa pozwala nam łatwo zarządzać danymi i jest zdecydowanie bardziej przyjazna dla użytkownika. Poniżej kilka przydatnych funkcji które możemy zastosować w tablicy:

  • unset() - usuwa wybrany element tablicy: unset($arr[1]); usunie 2gi element z tablicy

  • count() - zwraca ilość elementów w tablicy,

  • reset() - zwraca pierwszą wartość tablicy oraz resetuje wskaźnik operacji,

  • end() - zwraca ostatni element tablicy,

  • array_push  - dodaje nowy element na końcu tablicy,

  • array_pop - usuwa ostatni element tablicy,

  • array_unshift - dodaje nowy element na początku tablicy,

  • array_shift - usuwa pierwszy element tablicy,

  • array_merge - łączy dwie tablice w jedną,

  • array_slice() - zwraca nową tablicę z określonego zakresu,

  • array_diff() - zwraca różniące się elementy między tablicami,

  • sort() - sortuje elementy tablicy,

Oczywiście to tylko część funkcji z jakich można skorzystać do zarządzania tablicami, ich dokładny opis i sposób wykorzystania znajdziecie w dokumentacji PHP z którą na tym etapie polecam się powoli zaprzyjaźniać. Uwierzcie mi będziecie tam często zaglądali pisząc swoje pierwsze projekty.

2. Funkcje

Wkraczamy na przyjemny teren, funkcje które mogą wam się kojarzyć z matematyką i jest to bardzo dobre skojarzenie. Funkcja to nic innego jak kod który można wykorzystać wiele razy bez ponownego wpisywania go (niepotrzebne powtarzanie kodu nazywamy ładnie redundancją). Wracając do matematyki, mamy funkcję kwadratową f(x) = x^2 wiemy że w naszym programie będziemy niej często korzystali, stwórzmy więc taką funkcję w PHP:

<?php declare(strict_types = 1);

function sq($x): int {
	return ($x * $x);  //x*x to to samo co x^2
}

echo sq(2) . PHP_EOL;
echo sq(3) . PHP_EOL;
echo sq(5) . PHP_EOL;

Do naszej funkcji przesyłamy parametr (argument) a ona (funkcja) podnosi go do kwadratu i zwraca wynik, w tym wypadku zaoszczędziliśmy niewiele czasu i miejsca, dlatego zróbmy coś bardziej skomplikowanego. Powiedzmy że mamy tablice z użytkownikami, w której są też informacje na temat tego kiedy dołączył do naszej strony, jaka jest jego ranga oraz czy jest online. niby można to zapisać w pętli foreach ale co jeśli będziemy chcieli te same informacji wyświetlić na stronie danego użytkownika i będziemy wybierali tylko jeden element z tablicy, od nowa będziemy się łączyli poszczególne elementy tablic? No nie to bez sensu, jedziemy z funkcją:

<?php declare(strict_types = 1);
// przykładowa tablica z użytkownikami naszego serwisu
$users = [
	[
    	'name' => 'Bob',
      	'created_at' => '12-12-2021',
      	'rank' => 'User',
      	'online' => true,
    ],
    [
    	'name' => 'EpicDude',
      	'created_at' => '17-02-2020',
      	'rank' => 'Mod',
      	'online' => true,
    ],
  	[
    	'name' => 'Garlic',
      	'created_at' => '01-01-2000',
      	'rank' => 'Admin',
      	'online' => false,
    ]
];

function getUserDataAsString(array $user): string{
 	if ($user['online'] ) {
      	$active = 'green';
		$activeText = 'Online';
    } else {
      $active = 'red';
      $activeText = 'Offline';
    }
  
  	return sprintf(
      	'User: <b>%s</b><br /><i style="color: %s">%s</i><br>Rank: <u>%s</u><br>Join: %s<hr>', 
    	$user['name'] ?? '', $active, $activeText, $user['rank'] ?? '', $user['created_at'] ?? ''
    );
  	
}

foreach ($users as $v) {
  echo getUserDataAsString($v);
}

pewnie zauważyłeś zew funkcji użyliśmy innej funkcji sprintf - pozwala ona na stworzenie stringa w który w specjalnych miejscach zosatną wstawione dane, np w miesjce %s dodawany jest string, %d liczba całkowita w systemie dziesiętnym.

2. Klasy

- Podstawy

Funkcje są fajne ale dopiero kiedy połączymy je z klasami otrzymujemy mieszankę wybuchową która zamienia się w obiekt. Klasa to nic innego niż coś co opisuje jakiś obiekt, może to być cokolwiek: człowiek, krzesło, auto, czosnek, twoja piwnica. W przypadku klas wyróżniamy dwa ważne elementy:
Właściwości  - tutaj przechowywane są dane naszej klasy,
Funkcje - opisują co nasza klasa umie i może robić
Zarówno właściwości jak i funkcje mogą być: prywatne, chronione, publiczne:

a) prywatne (private) - do tych funkcji i właściwości ma dostęp tylko nasza klasa
b) chronione (protected) - do tych funkcji i właściwości ma dostęp nasza klasa oraz klasy które po niej dziedziczą (czym jest dziedziczenie dowiesz się za chwilę).
c) publiczne (public) -  każdy ma dostęp do funkcji lub właściwości.

Ostatnio opcja w przypadku właściwości nie jest zazwyczaj zalecana ponieważ zmiana danych bez ich odpowiedniej walidacji może spowodować niemałe zamieszanie w aplikacji. W tym celu stosujemy hermetyzację danych, czyli nasze właściwości są albo prywatne albo chronione a publiczne są jedynie funkcje naszej klasy które mają dostęp do właściwości i mogą pozwalać na ich zmianę lub tylko pobranie. Tutaj również docenimy declare(strict_types = 1); która dodatkowo zabezpieczy nas przed przesłaniem nieprawidłowych informacji.

w klasach m=korzystamy też ze magicznych funkcji takich: __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __serialize(), __unserialize(), __toString(), __invoke(), __set_state(), __clone(), __debugInfo().
na razie wystarczy nam wiedzieć że __construct() jest to konstruktor który przypisuje dane do właściwości podczas tworzenie nowej instancji naszej klasy, może też oczywiście wykonywać inne operacje.

W kodzie klasy spotkasz jeszcze zmienną $this oznacza ono że chodzi o naszą klasę, właśnie tą w której piszemy kod, nie żadną inną. $this->foo; to zmienna $foo naszej klasy nie nie klasy Garlic, $this->blow(); to funkcja klasy w której aktualnie umieszczamy kod nie żadnej innej!

Stwórzmy sobie przykład, niech naszym obiektem będzie użytkownik twojego serwisu, jego właściwości to to że ma jakaś nazwę, rangę, informację kiedy założył konto oraz to czy jest aktualnie online. A co możemy robić z tym użytkownikiem? Chcemy zmieniać jego aktywność i czasem rangę, chcemy też żeby na start dostawał nasza klasa miała uzupełnione wszystkie dane:

<?php declare(strict_types = 1);

Class User {
  	// definiujemy właściwości naszego użytkownika, są chronione czyli z zewnątrz nie będzie do nich dostępu
    protected string $name;
    protected string $rank;
    protected string $created_at;
    protected bool $active;
    
  	// przesyłamy dane o użytkowniku podczas tworzenia nowej instancji
    public function __construct(string $name, string $rank, string $created_at, bool $active) 
    {
        $this->name = $name;
        $this->rank = $rank;
        $this->created_at = $created_at;
        $this->active = $active;
    }
    // wyświetlamy ładnie w stringu
    public function getDataAsString() : string
    {
        if ($this->active) {
          	$active = 'green';
    		$activeText = 'Online';
        } else {
          $active = 'red';
          $activeText = 'Offline';
        }
  
  	    return sprintf(
          	'User: <b>%s</b><br /><i style="color: %s">%s</i><br>Rank: <u>%s</u><br>Join: %s<hr>', 
        	$this->name, $active, $activeText, $this->rank, $this->created_at 
        	);
    }
    
  	// tworzymy funkcję pozwalającą zmienić rangę użytkownika i pilnującą żeby przesyłane dane były ciągiem znaków
    public function setRank(string $rank): void 
    {
        $this->rank = $rank;
    }
    
  	// tworzymy funkcję pozwalającą zmienić aktywność  użytkownika i pilnującą żeby przesyłane dane były wartością prawda/fałsz
    public function setActive(bool $active): void
    {
        $this->active = $active;   
    }
    
}

// tworzymy nową tablicę w której umieścimy naszych użytkowników.
$u = [];
// tworzymy nowe instancje naszych użytkowników i wpychamy do naszej tablicy
$u[] = new User('Bob', 'Admin', '12-12-2021', true);
$u[] = new User('Zed', 'Dead', '11-11-2020', true);
$u[] = new User('Dude', 'User', '02-02-2019', false);

// robimy pętlę po tablicy i wyświetlamy dane korzystając z funkcji jaka została zdefiniowana w naszej klasie do stworzenia ładnego ciągu znaków.
foreach ($u as $user) {
    echo $user->getDataAsString();
}

Pewnie zobaczyłeś kilka nowości, jak np. typ zmiennej przed jej podaniem, taki zapis spowoduje błąd jeśli spróbujemy zapisać tam inny typ zmiennej, super sprawa bo wiemy że mamy zawsze dobry typ. Dodatkowo po funkcjach jest widoczny kolejny zapis np : void albo : string to nic innego jak deklaracja co ma zwrócić funkcja naszej klasy, w przypadku void nie zwraca ona nic.

Rozważmy teraz jeszcze jeden przypadek, obecnie zmieniając dane musimy to robić za każdym razem w nowej linijce tak:

<?php declare(strict_types = 1);

$user = new User('Nazwa', 'Ranga', '11-11-2011', true);
$user->setActive(false);
$user->setRank('Nowa ranga');

co zrobić żeby dało się to osiągnąć w jednej linijce o tak:

<?php

$foo = new Foo();
$foo->bar('a')->baz(2);

Funkcja naszej klasę może zwrócić samą klasę poprzez zwrócenie $this, ok zróbmy mały refaktoring naszej klasy, dodatkowo przekażmy konstruktorowi domyślne wartości gdyby ktoś nie uzupełnił ich podczas tworzenia nowej instancji:

<?php declare(strict_types = 1);

Class User {
    protected string $name;
    protected string $rank;
    protected string $created_at;
    protected bool $active;
    
    public function __construct(string $name = 'unnamed', string $rank = 'no rank', string $created_at = '00-00-0000', bool $active = false) 
    {
        $this->name = $name;
        $this->rank = $rank;
        $this->created_at = $created_at;
        $this->active = $active;
    }
  
    public function getDataAsString() : string
    {
        if ($this->active) {
          	$active = 'green';
    		$activeText = 'Online';
        } else {
          $active = 'red';
          $activeText = 'Offline';
        }
  
  	    return sprintf(
          	'User: <b>%s</b><br /><i style="color: %s">%s</i><br>Rank: <u>%s</u><br>Join: %s<hr>', 
        	$this->name, $active, $activeText, $this->rank, $this->created_at 
        	);
    }
    
    public function setRank(string $rank): User 
    {
        $this->rank = $rank;
      	return $this;
    }
    
    public function setActive(bool $active): User
    {
        $this->active = $active;   
      	return $this;
    }
    
}

$user = new User('Bob', 'Admin', '12-12-2021');
echo $user->setRank('SuperAdmin')->setActive(true)->getDataAsString();

czy zauważyłeś ze nie przekazałem wszystkich danych tworząc nową instancję? Jeśli sprawdziłbyć za pomocą var_dump co znajduje się w zmiennej $user zaniem zmieniliśmy aktywność byłoby to false zdefiniowane w naszym konstruktorze 🙂

- Dziedziczenie

klasy mogą dziedziczyć (rozszerzać) własności i funkcje po już istniejącej klasie, jest to bardzo wygodna możliwość dzięki której tworzymy tylko jedną klasę w której są podstawowe funkcje i właściwości a następnie rozszerzamy ją i dopasowujemy do potrzeb, zobrazujmy to na przykładzie:

<?php declare(strict_types = 1);
 // tutaj jest nasza wcześniejsza klasa User (u siebie możesz ją wkleić)

Class Admin extends User {
    
    public function setName(string $name): Admin
    {
        $this->name = $name;
		return $this;
    }
    
    public function setCreatedAt(string $created_at): Admin
    {
        $this->created_at = $created_at;
      	return $this;
    }
    
}


$a = new Admin('Zed', 'admin', '01-02-2017', true);
$a->setName('PanKrok');
echo $a->getDataAsString();

Klasa Admin dziedziczy po klasie User, dlatego nie musiałem ponownie tworzyć właściwości name a pomimo to mam do niej dostęp, prawda że wygodne? Jednak dostęp do właściwości i funkcji rodzica w nowej klasie jest możliwy tylko jeśli są one publiczne lub chronione!

3 Bonus przechwytywanie danych formularza

przyznam się że nie wiedziałem gdzie o upchnać więc będzie tutaj 😉 Jak złapać dane od użytkownika przez formularze html lub z url? do tego służą nam zmienne $_POST oraz $_GET
pierwsza łapie dane z formularzy post, druga z formularzy get/adresu url:

<html>
<body>

<h2>HTML Forms</h2>

<?php

if (isset($_POST['name'])) {
	echo 'twoje imię to: ' . $_POST['name'] . PHP_EOL;
}

if (isset($_GET['rank'])) {
	echo 'twoja ranga to: ' .  $_GET['rank'] . PHP_EOL;
}

?>
<form method="post" action="#">
  <label for="name">Podaj imię:</label><br>
  <input type="text" id="name" name="name" ><br>
  <input type="submit" value="Prześlij">
</form> 

<form method="get" action="#">
  <label for="rank">Podaj rangę:</label><br>
  <input type="rank" id="renk" name="rank" ><br>
  <input type="submit" value="Prześlij">
</form>  

</body>
</html>

funkcja isset sprawdza czy dany parametr został podany.

Ok myślę że jak na jeden raz to wystarczająca ilość teorii żeby nikomu nie rozsadziło głowy, teraz czas na zadanie domowe 😄
Napisz program który będzie zawierał
-> klasę Samochód,
-> klasa ma zawierać chronione właściwości: kolor, rok produkcji, moc (ma być to zmienna intiger),
-> konstruktor klasy Samochód powinien dawać możliwość sprecyzowania wszystkich właściwości i przesyłać domyślne dane w przypadku nie przesłania ich przez użytkownika,
-> funkcje która pozwala na wyświetlenie wszystkich danych jako string,
-> funkcje która pozwala na zmianę koloru,
-> funkcje która pozwala na zmianę roku produkcji,
-> funkcje która pozwala na zmianę mocy,
-> stworzyć klasę która dziedziczy po klasie Samochód o nazwie Ford i zawiera właściwość: model i posiada funkcję do zmiany modelu
-> dodatkową funkcję która wywoła już dziedziczoną funkcję z danymi samochodu i doklei model;
-> formularz który pozwoli wprowadzić wszystkie dane, korzystając z metody POST przechwyć dane i umieść je w instancji Ford, a następnie wyświetl wszystkie dane pod formularzem.

poniżej przykładowe rozwiązanie w wersji spagetti kod (tego niemiłego efektu pozbędziemy się niedługo), proszę jednak nie sprawdzaj przykładowego kodu zanim sam nie spróbujesz rozwiązać zadania.

tut3.php

Edytowane przez Pankrok
fix błędów wyłapanych przez -n3veR
Odnośnik do komentarza
Udostępnij na innych stronach

  • Założyciel
Opublikowano
Opublikowano

Dziękuję za kolejną część kursu. 

Odnośnik do komentarza
Udostępnij na innych stronach

Opublikowano
Opublikowano
W dniu 21.01.2022 o 13:52, Pankrok napisał:

a) prywatne (protected) - do tych funkcji i właściwości ma dostęp tylko nasza klasa

protected => private 🙂

Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert
Opublikowano
Opublikowano

Dzięki @...Akki za wyłapanie, poprawione

Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert
Opublikowano
Opublikowano

Do poprawy deklaracja metody - brakuje typu:

function sq(int $x) {
	return ($x * $x);  //x*x to to samo co x^2
}

 

Ta metoda też do poprawy:

function getUserDataAsString(array $user){
    $isOnline = (bool)($user['online'] ?? false);
    $active = 'red';
    $activeText = 'offline';

    if ($isOnline) {
        $active = 'green';
        $activeText = 'online';
    }

    return sprintf(
        'User: <b>%s</b><br><i style="color: %s">%s</i><br>Rank: <u>%s</u><br>Join: %s<hr>',
        $user['name'] ?? '', $active, $activeText, $user['rank'] ?? '', $user['created_at'] ?? ''
    );
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert
Opublikowano
Opublikowano
W dniu 21.01.2022 o 13:52, Pankrok napisał:

b) chronione (protected) - do tych funkcji i właściwości ma dostęp nasza funkcja oraz funkcje które po niej dziedziczą (czym jest dziedziczenie dowiesz się za chwilę).

> do tych funkcji i właściwości ma dostęp nasza klasa oraz klasy, które (...)

W dniu 21.01.2022 o 13:52, Pankrok napisał:

a publiczne są jedynie funkcje naszej klasy które zawsze mają dostęp do właściwości

Odważna teza 😄 co w przypadku klasy statycznej? Też ma dostęp do właściwości bez wcześniejszego zaprogramowania?

W dniu 21.01.2022 o 13:52, Pankrok napisał:

W kodzie klasy spotkasz jeszcze zmienną $this oznacza ono że chodzi o naszą klasę, właśnie tą w której piszemy kod

Niekoniecznie będzie chodzić o "tą klasę, w której piszemy kod". Bo po strzałce pojawią się tam też właściwości i metody z klas nadrzędnych, w tym klas abstrakcyjnych i interfejsów.

Co do metod magicznych, to korzysta się na co dzień tylko z kilku. W starych projektach można spotkać ich nadużycie, ale odchodzi się od tego. Dobre praktyki redukują ilość ich użycia, żeby nie tworzyć magocznego kodu, a dobry i zrozumiały 😛 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert
Opublikowano
Opublikowano (edytowane)

A co do klasy User, przykład naciągany, ale obrazuje to co chciałeś przekazać. Dodatkowo, słowo "class" z małej i nie wspomniałeś o słowie "final" 😉

I w sumie jeszcze pytanie. Kiedy wspomnisz o kolekcjach? Bo skoro mamy już tablice i OOP, to może już czas na kolekcje? 😛

Edytowane przez -n3veR
Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert
Opublikowano
Opublikowano (edytowane)

@-n3veR wiedziałem że przyjdziesz z pomocą, dzięki za wyłapanie błędów i nieścisłości:
1)  fixed

2 godziny temu, -n3veR napisał:

Do poprawy deklaracja metody - brakuje typu:


2)  fixed

2 godziny temu, -n3veR napisał:

> do tych funkcji i właściwości ma dostęp nasza klasa oraz klasy, które (...)

3) słuszna uwaga, static i abstract gdzieś uciekło w ferworze walki z próbą opisania tego wszystkie łatwo i przyjemnie trzeba będzie nadrobić. Możesz rozwiązać temat dostępu w przypadku klasy statycznej bo chyba nie łapię o co Ci chodzi.

2 godziny temu, -n3veR napisał:

co w przypadku klasy statycznej? Też ma dostęp do właściwości bez wcześniejszego zaprogramowania?

4)

2 godziny temu, -n3veR napisał:

nie wspomniałeś o słowie "final"

pozostaje seppuku żeby wyjść z twarzą:

mr met GIF

 

Edytowane przez Pankrok
Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert
Opublikowano
Opublikowano

Ogólnie jest dobrze, nie ma co płakać i popełniać seppuku 😛

 

27 minut temu, Pankrok napisał:

Możesz rozwiązać temat dostępu w przypadku klasy statycznej bo chyba nie łapię o co Ci chodzi.

Źle się wyraziłem, bo nie ma klas statycznych 😄 Chodziło mi o użycie metody statycznej z klasy. Taka metoda - bez podniesienia klasy - nie ma dostępu do właściwości danej klasy.

Chodzi mi o takie użycie:

<?php

declare(strict_types=1);

Class::staticMethod();

W ciele metody `public static function staticMethod()` nie będziesz mógł skorzystać z $this bez odpowiedniego zaprogramowania 😉

Z takim rozwiązaniem (podniesieniem klasy w metodzie statycznej) połączony jest pewien (anty) wzorzec - Singleton, ale to nie czas na naukę wzorców 😄

Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert
Opublikowano
Opublikowano
15 minut temu, -n3veR napisał:

W ciele metody `public static function staticMethod()` nie będziesz mógł skorzystać z $this bez odpowiedniego zaprogramowania 😉

fakt zwróci błąd, powodem tego jest całkowite pominięcie przeze mnie metod i właściwości statycznych które zachowują się inaczej, za bardzo zafixowałem się na obiektach. Będzie errata w przyszłym tygodniu w kolejnym kursie.

16 minut temu, -n3veR napisał:

(anty) wzorzec - Singleton

używałem go kilka razy w Unity, w PHP nie spotkałem się z jego wykorzystaniem i nawet nie mam pomysłu gdzie by go można użyć.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Ekspert
Opublikowano
Opublikowano (edytowane)
Godzinę temu, Pankrok napisał:

w PHP nie spotkałem się z jego wykorzystaniem i nawet nie mam pomysłu gdzie by go można użyć.

Jakbyś chciał mieć jeden jedyny obiekt na całą aplikację - taki Config, jako przykład - to wtedy użyjesz Singletona. Wiesz, że nawet jak użyjesz `::getInstace()`, to i tak otrzymasz ten sam obiekt co w innym miejscu w aplikacji.

Ale jest on antywzorcem, więc już na prawdę baaardzo rzadko go widać na projektach. I w sumie dobrze 😛

Edytowane przez -n3veR
Odnośnik do komentarza
Udostępnij na innych stronach

Problem wciąż nierozwiązany? Dodaj swoją odpowiedź

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto. Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
 Udostępnij

×