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.
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ść.
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
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.
https://github.com/eerie79/framework_svn
Pozdrawiam
EERIE