• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Plik z funkcjami a klasa

VPS Starter Arubacloud
0 głosów
321 wizyt
pytanie zadane 5 lutego 2017 w PHP przez Mistrz0000000 Bywalec (2,780 p.)
Witam, mam do was takie jedno pytanie. Czy includowanie pliku z funkcjami i używanie ich bezpośrednio, a używanie funkcji w klasie czymś się różni ? Kiedyś jak jechałem na czystym php to korzystałem z pierwszej opcji, a teraz trochę bardziej staram się liznąć obiektówki i stąd to pytanie. Osobiście według mnie używanie bezpośrednio samych funkcji z includowanego pliku było wygodniejsze, ale może chodzi tu o jakieś większe bezpieczeństwo? Chętnie wysłucham waszych odpowiedzi.

1 odpowiedź

+1 głos
odpowiedź 5 lutego 2017 przez xandros Nałogowiec (29,450 p.)
edycja 5 lutego 2017 przez xandros

Mógłbyś bardziej wyjaśnić, o co chodzi z pierwszym zdaniem:

Witam, mam do was takie jedno pytanie. Czy includowanie pliku z funkcjami i używanie ich bezpośrednio, a używanie funkcji w klasie czymś się różni ? 

 Bo jeśli chodzi ci o:

class User {
      public function login(){
               doSomething();
      }
}


function doSomething(){
    echo "we are doing something";  
}

To się używa, ale baaaardzo rzadko. Dlaczego? Bo tworzenie kolejnych poziomów abstrakcji jest lepsze :d

Ewentualnie, jak potrzebujesz jakiś helperów, to tworzysz albo statyczne klasy z helperami (Yii2), albo traity(Laravel).

Helper to funkcja wspomagająca. Taka, która, gdy przyjmuje taki sam argument, za każdym razem zwraca identyczny.

Edit:

Odpisalem na to pytanie poprzednio :P

Wyzwalanie funkcji przez:

User::login();

Jest identyczne, jakbyś wyzwalał funkcje normalną.

Ale tak jak pisałem, używanie takich funkcji powinno się sprowadzać do helperów:

Helper to funkcja wspomagająca. Taka, która, gdy przyjmuje taki sam argument, za każdym razem zwraca identyczny.

Dlaczego powinno? Zmieniając zmienne statyczne lub globalne, mozemy nie moc zdebugowac problemu, a nasza aplikacja może działać w sposób dla nas, lub innego developera nie logicznie, czyli tak, jakbyśmy sobie tego życzli.

Samo "includowanie" wiąże się z ładowaniem plików. Oczywiście klasy są ładowane przez loadera: http://php.net/manual/en/function.spl-autoload-register.php który przeważnie jest inicjowany przez composera: https://getcomposer.org/ . Pliki z czystymi funkcjami trzeba ładować ręcznie (poprawcie mnie jeśli się myle). Composer oczywiście oferuje funkcjonalność ładowania takich plików. Ale dalej on są ładowane stale. Czyli nie wtedy, kiedy tworzymy dany obiekt, lub odwołujemy sie do funkcji statycznej.

Dobrym przykładem użycia helpera jest: (chyba że używasz twiga, co w 90% jest lepsze)

https://github.com/yiisoft/yii2/blob/master/framework/helpers/BaseHtml.php#L138 //polecam przeczytać całą funkcje

złym natomiast jest użycie:

<?php

class User{
   private static $currentUser;
    public static function login(){
            $_SESSION['id'] = self::$currentUser->id;
            $_SESSION['logged'] = true;
    }
}

Laravel trochę inaczej podchodzi do podobnych problemów, co też nie jest zbyt dobrym rozwiązaniem:

https://github.com/illuminate/database/blob/master/Eloquent/Model.php#L1326

Czyli przy każdym staticu wyzwalany jest new i dana metoda.

 

TLDR:

Chodzi o stosowanie abstrakcji, myślenie obiektowe i dostępność. Nie wszędzie potrzebujemy funkcionalności logowania, co nie?

komentarz 5 lutego 2017 przez Mistrz0000000 Bywalec (2,780 p.)

Chodzi mi o zwykłe używanie klas

class User
{
    public function login()
    {
    }
    public function register()
   {
   }
{

i spodób którego używałem czyli includowanie pliku np. functions.php

funkcja()
{
}
funkcja2()
{
{
funkcja3()
{
}

i potem poprostu używanie funkcja() zamiast User::login()

komentarz 5 lutego 2017 przez xandros Nałogowiec (29,450 p.)
Update odpowiedzi
komentarz 5 lutego 2017 przez Mistrz0000000 Bywalec (2,780 p.)
Tzn ja kożystam z laravela ale interesuje mnie to i dalej nie eozumiem czym różnią się dwa podane przezemnie sposoby. i załóżmy że zamiast User::login() zrobię new User->login()
komentarz 5 lutego 2017 przez xandros Nałogowiec (29,450 p.)

i załóżmy że zamiast User::login() zrobię new User->login()

błąd syntaxu, powinno być (new User())->login(); :P 

Wyjasniłem to w ostatnim akapicie odpowiedzi. (3. update)

dalej nie eozumiem czym różnią się dwa podane przezemnie sposoby

Laravel używa takich funkcji jak helperów (ale w zły sposób):

https://github.com/laravel/framework/blob/5.4/src/Illuminate/Foundation/helpers.php

app() to jest odwoładnie do singletona

https://github.com/domnikl/DesignPatternsPHP/tree/master/Creational/Singleton

http://lukasz-socha.pl/php/wzorce-projektowe-cz-1-singleton/

komentarz 5 lutego 2017 przez efiku Szeryf (75,160 p.)
Przy testach jednostkowych się dowiesz. ;)

Xandros jak juz pokazałeś same (tfu ) statyczne metody itd. ( generalnie same antypatterny) To chociaż pokaż serwisy ;)

Google: php jak programować obiektowo.

Podobne pytania

0 głosów
1 odpowiedź 153 wizyt
pytanie zadane 7 grudnia 2016 w C i C++ przez DragonCoder Nałogowiec (36,500 p.)
0 głosów
4 odpowiedzi 1,518 wizyt
pytanie zadane 8 września 2016 w C i C++ przez Tadeusz Jasińska Nowicjusz (190 p.)
+1 głos
3 odpowiedzi 572 wizyt

92,965 zapytań

141,930 odpowiedzi

321,163 komentarzy

62,299 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...