Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Jak stosować interfejsy?
eerie
post
Post #1





Grupa: Zarejestrowani
Postów: 114
Pomógł: 0
Dołączył: 3.08.2017

Ostrzeżenie: (0%)
-----


Nie czuję do końca stosowania interfejsów w mojej aplikacji... Poniżej podaję, jak to obecnie wygląda. Może tak zostać bądź coś poprawić?

Utworzyłem interfejs Mysqli dla klasy Database:

Kod
<?php

declare(strict_types=1);

namespace App\Core;

interface Mysqli
{
    public function dbConnect(): void;
    public function dbClose(): void;
    public function dbQuery(string $query): mixed;
    public function dbFetchArray(mixed $result): array|null|false;
    public function dbNumberRows(mixed $result): int;
    public function dbAffectedRows(): int;
    public function dbInsertId(): int;
    public function dbStartTransaction(): bool;
    public function dbCommit(): bool;
    public function dbRollback(): bool;
}


Interfejs Mail jest implementowany przez Email:

Kod
<?php

declare(strict_types=1);

namespace App\Core;

interface Mail
{
    public function sendEmail(
        string $serverName,
        string $emailFrom,
        string $emailTo,
        string $subject,
        string $message
    ): bool;
}


Oraz interfejs Validator jest implementowany przez abstrakcyjne klasy Code, Error i Message, które są potem rorszerzane przez podklasy odpowiedziane za validację (np. MainPageValidator) danych z formularzy czy api:

Kod
<?php

declare(strict_types=1);

namespace App\Core;

interface Validator
{
    public function isValid(): bool;
}


Wypadałoby dodać jeszcze inne interfejsy dla moich klas tutaj? Trochę nie czuję, gdzie powinienem stosować interfejsy...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




1) Napisales ktore klasy implementuja ktore interfejsy, ale wchodzac w ich kod, nie widze zadnej implementacji.
2) Po co ten przedrostek "db" ?
3)
public function dbQuery(string $query): mixed
{
return mysqli_query($this->mysqlLink, $query);
}

Ta metoda powinna zwracac bool a nie zasob mysqli. Po to sie robi interfejsy, by klasa byla uniwersalna a nie ty wymuszasz na nas znajmosc faktu iz zwraca jakis zasob mysqli. Mnie, jako uzytkownika tej klasy guzik obchodzic powinno czy to mysqli, czy mysql czy pdo. wykonuje query, a potem chce pobrac rekordy z tego query. wiec np. ten zasob powinien byc trzymany w klasie.
Z drugiej strony, moze byc faktycznie sytuacja, gdzie na raz wykonujesz dwa zapytania, np petla w petli i wtedy ten zasob jest potrzebny. No ale to mozna rozwiazac inaczej, np. klasa nie zwraca zasob ale number zasobu, i zasoby nadal so trzymany w klasie w tablicy, albo jak chcesz zwracac zasob, to moze warto tez zrobic to na interfejscie DBResource
4) interface Mysqli
Nie, masz zrobic interface DB, a potem klase MysqlI ktore go implementuje. Interfacy sluza by mowic o czym ogolnie, a nie robisz interface pod dana klase od razu
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 13.10.2025 - 20:17