Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Oceny _ Szkielet aplikiacji w php 7+

Napisany przez: eerie 3.08.2017, 11:46:27

Dzień dobry

Napisałem bardzo prosty szkielet aplikiacji w php 7+ oparty na Symfony. Czy mógłbym prosić o ocenę, czy jest fachowo napisany?

https://github.com/eerie79/framework_svn

Mam następujące wątpliwości:

1. Czy jest sens kodować w php7 z użyciem "declare(strict_types = 1);"?
2. Jakiego typu zmienną jest rezultat funkcji "mysqli_query"? Jak zapisać to w php7?

https://github.com/eerie79/framework_svn/blob/master/src/Core/DataBase.php

public function dbQuery(string $query): co_tu_podać?
{
return mysqli_query($this->mysqlLink, $query);
}

Pozdrawiam
EERIE

Napisany przez: nospor 3.08.2017, 12:09:04

ad1) Moze wpierw dowiedz sie co robi declare(strict_types = 1); bo patrzac po kodzie odnosze wrazenie ze walisz gdzie popadnie nie wiedzac w ogole co to robi
I tak, jak najbardziej jest sens uzywania tego, a wrecz nawet by wypadało uzywac.

ad2) Po co ci wlasna klasa DB skoro jak sam napisales oparles to o symfony?

ps ad2) A tak poza tym to manuala zamkneli? Przeciez tam wyraznie napisane co zwraca:
http://php.net/manual/en/mysqli.query.php

Cytat
Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.

Napisany przez: eerie 3.08.2017, 13:44:49

Sorry. Skończyłem tylko jednoroczne studia podyplomowe. Nie nauczyli mnie tam wiele. Sam zdobywam wiedzę z książek i internetu...

Cytat
ad1) Moze wpierw dowiedz sie co robi declare(strict_types = 1); bo patrzac po kodzie odnosze wrazenie ze walisz gdzie popadnie nie wiedzac w ogole co to robi
I tak, jak najbardziej jest sens uzywania tego, a wrecz nawet by wypadało uzywac.

No, deklaracja ta włącza tryb "strict". W praktyce sam musiałem wykonać rzutowanie typów zmiennych, bo wywaliło mi kupę błędów. Ale czy robię to dobrze?

Np. najpierw pobieram postem wartość z formularza:

$province = (is_numeric($_POST['province']) && $_POST['province'] >= 1) ? $_POST['province'] : 0;

Potem dopiero w wywoływanej metodzie wykonuję rzutowanie: (int) $province

$array = $addController->addAction($name, $surname, (int) $province, (int) $city);

Czy nie da się jakoś zrobić, aby zmienna $province od razu była liczbą całkowitą, a nie łańcuchem? Czy robię to dobrze?

Czy to znaczy, że deklarazji declare(strict_types=1); powiniennem używać we wszystkich plikach z kodem php? Sorry, nie spotkałem się z tym wcześniej...

Cytat
ad2) Po co ci wlasna klasa DB skoro jak sam napisales oparles to o symfony?

Sorry... Nie oparłem to na Symfony, tylko wzorowałem się na Symfony. wink.gif

Jest to bardzo prosty szkielet aplikacji, który napisałem wzorując się na fremework'u symfony. Wszsytko napisałem możliwie najprościej i od podstaw.

Cytat
ps ad2) A tak poza tym to manuala zamkneli? Przeciez tam wyraznie napisane co zwraca:
http://php.net/manual/en/mysqli.query.php

Jaki typ zmiennej bym nie podał, że moja metoda zwraca, to wywala mi błąd. Podawałem "mysqli_result", ale wywala błąd, że nie mam takiej klasy. Jak sobie z tym poradzić?

EERIE

Napisany przez: nospor 3.08.2017, 14:07:29

ad1) Chodzilo mi bardziej o kody takie jak ten
https://github.com/eerie79/framework_svn/blob/master/src/Config/config.php
tam declare jest raczej zbedne.
Wszedzie indziej jak najbardziej.

Rzutowanie rob juz na etapnie inicjalizcji zmiennej
$province = (is_numeric($_POST['province']) && $_POST['province'] >= 1) ? (int) $_POST['province'] : 0;

ad2) Nie mozesz tam okreslic typu jednoznacznie, poniewasz jak masz wyraznie napisane, to moze zwracac wiele typow, false/true, mysqli_result.

Napisany przez: eerie 3.08.2017, 16:03:11

Poprawiłem rzutowanie. Mam jeszcze problem z klasą DataBase.

https://github.com/eerie79/framework_svn/blob/master/src/Core/DataBase.php

Dla metody dbQuary() zwracana wartość jest niejednoznaczna. Więc zostawić bez deklarowania zwracanego typu?

public function dbQuery(string $query)
{
return mysqli_query($this->mysqlLink, $query);
}

Dla metody dbFetchArray() $result jest typu "mysqli_result", ale dostaję wtedy błąd, że nie ma takiej klasy. Gdzie ją znajdę?

public function dbFetchArray(mysqli_result $result): array
{
return mysqli_fetch_assoc($result);
}

PS Pewnie rozwiązanie jest banalne, ale jakoś nie mogę na nie wpaść. smile.gif

EERIE

Napisany przez: nospor 3.08.2017, 16:11:11

Zacznij czytac co pisze manual o funkcjach ktorych uzywasz
mysqli_fetch_assoc zwraca array lub NULL

Generalnie ta twoja cala klasa do bazy dla mnie jest bez sensu bo wziales poprostu napisales dokladny wrapper na mysqli z funkcjami takimi samymi jakie ma mysqli. Ciezko w takim wypadku przypisac rozne typy zwrotow bo mysqli raz zwraca bool a raz cos innego w zaleznosci od sytuacji.

Napisany przez: eerie 3.08.2017, 16:32:49

Więc jak w takiej sytuacji postepować, gdy metoda zwraca za każdym razem coś innego? Brak deklaracji zwracanego typu jest dopuszczalny? Bo dopiero zaczynam z php7 i nie mam zielonego pojęcia. Trudno o przykłady w necie...

Napisany przez: nospor 3.08.2017, 17:35:06

Cytat
Brak deklaracji zwracanego typu jest dopuszczalny?
Dopuszczalny przez kogo/co ? Przeciez w swoim kodzie nie raz nie masz ustawionego typu i jakos php7 pozwala ci na jego wykonywanie.
Generalnie dobrze jest okreslac typ. To procentuje w przyszlosci.

Jesli tak bardzo chcesz trzymac sie klasy w obecnej formie to stworz poprostu wlasna klase Result i za kazdym razem zwracaj jej obiekt, ktoremu to przypiszesz wynik funkcji mysqli. Zawsze bedziesz wiec zwracal obiekt klasy Result a co w nim bedzie to juz nikomu nic do tego smile.gif



edit: zas co do array, ktore raz moze byc array a raz null to nie
: array

a:
: ?array

Napisany przez: eerie 3.08.2017, 22:53:44

Cytat
Dopuszczalny przez kogo/co ? Przeciez w swoim kodzie nie raz nie masz ustawionego typu i jakos php7 pozwala ci na jego wykonywanie.

Poprawiłem to i ustawiłem typ void, gdy wartość nie jest zwracana. Nadal mam problem z klasą DataBase (mysqli_result).

https://github.com/eerie79/framework_svn/blob/master/src/Core/DataBase.php

Cytat
Jesli tak bardzo chcesz trzymac sie klasy w obecnej formie to stworz poprostu wlasna klase Result i za kazdym razem zwracaj jej obiekt, ktoremu to przypiszesz wynik funkcji mysqli. Zawsze bedziesz wiec zwracal obiekt klasy Result a co w nim bedzie to juz nikomu nic do tego

Trochę to zamieszane. Wolałbym prostrze rozwiązanie. Ale to chyba nie w tej wersji php.

Czekam na sugestie odnośnie zmian w moim szkielecie aplikacji. Moim celem było stworzenie możliwie najprostrzego kodu php. Framework Symfony nie jest wcale taki łatwy do nauczenia. wink.gif

https://github.com/eerie79/framework_svn

Pozdrawiam
EERIE

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)