Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Dlaczego Yii zamyka wszystko w osobnych namespaces
Forum PHP.pl > Forum > Przedszkole
konrados
Hej,

Próbuję zrozumieć używanie namespaces w php.

Patrząc na Yii, który chwali się użyciem php 5.4 (coś tam zdaje się nowego wprowadzili jeśli chodzi o namespacy) to wydaje mi się, że przesadzili.

Bo czemu nie umieścić całego frameworka w jednym namespace? Przecież to są jedni ludzie (developerzy), więc jak będzie konflikt w core, to zauważą.

Druga sprawa: jaki jest właściwie pożytek z używania namespaces vs klasy i metody statyczne? Ja wiem, że w namespace można też umieścić funkcje (nie metody) oraz zmienne globalne dla danego namespace, ale przecież to jest z góry złe.
Crozin
Cytat
Bo czemu nie umieścić całego frameworka w jednym namespace? Przecież to są jedni ludzie (developerzy), więc jak będzie konflikt w core, to zauważą.
Żeby uniknąć bałaganu? Co z tego, że to jeden projekt.
Cytat
jaki jest właściwie pożytek z używania namespaces vs klasy i metody statyczne?
Jedno z drugim nie ma absolutnie nic wspólnego - pomijając już fakt, że w PHP nie istnieją klasy statyczne. Doprecyzuj o co Ci chodzi.
konrados
Chodziło mi o metody a nie klasy statyczne. Zresztą, istnieją w jakimkolwiek języku klasy statyczne?

Tak więc ponawiam pytanie: czemu nie używać metod statycznych, np:

  1. class File{
  2. public static rename($src,$dest){
  3. ...
  4. }
  5. }
  6.  
  7. File::rename('coś','na coś');


Czy to nie jest identyczne z namespaces:

  1. File::rename('coś','na coś');


Edit: trochę poszukałem i znalazłem to: http://www.sitepoint.com/php-53-namespaces-basics/
I z tego artykułu wynika, że użycie namespaces pomaga właśnie przy zmiennych globalnych, funkcji globalnych. Ale po co? Skoro można użyć klas. I metod statycznych.

Pomóżcie zrozumieć...
by_ikar
Ok ale nazwy File możesz wtedy wówczas użyć raz, a dzięki przestrzeni nazw możesz użyć tej nazwy ile razy tylko sobie chcesz, oczywiście tylko raz w obrębie jednej przestrzeni nazw. Dzięki czemu możesz mieć przykładowo przestrzeń Cache która używa sterownika File do zapisu cache do pliku, a ów sterowniki może używać klasy File z przestrzeni nazw Util. Dzięki czemu nie duplikujesz funkcjonalności, możesz używać te same nazwy klas.

konrados
Cytat
Ok ale nazwy File możesz wtedy wówczas użyć raz, a dzięki przestrzeni nazw możesz użyć tej nazwy ile razy tylko sobie chcesz, oczywiście tylko raz w obrębie jednej przestrzeni nazw. Dzięki czemu możesz mieć przykładowo przestrzeń Cache która używa sterownika File do zapisu cache do pliku, a ów sterowniki może używać klasy File z przestrzeni nazw Util. Dzięki czemu nie duplikujesz funkcjonalności, możesz używać te same nazwy klas.


Kurde... możesz dać przykład, bo się pogubiłem. Przecież, cytując "ale nazwy File możesz wtedy wówczas użyć raz, a dzięki przestrzeni nazw możesz użyć tej nazwy ile razy tylko sobie chcesz, oczywiście tylko raz w obrębie jednej przestrzeni nazw", wygląda mi na to, że to samo można zrobić z klasami i metodami statycznymi.

Możesz dać przykład?
by_ikar
Oczywiście że da radę to samo zrobić z klasami, ale wtedy wówczas to są pseudo przestrzenie nazw. Tylko że powstało coś takiego jak PSR-0 i PSR-1 które niejako narzucają pewne standardy, dzięki czemu ja w ogóle nie znając kodu, otwieram go i z łatwością czytam, nie muszę się domyślać o co autorowi tego kodu chodziło itp. Dzięki standardom łatwiej pracuje się w grupach nad jednym kodem a i później ów kod łatwiej jest refaktoryzować.
konrados
Cytat(by_ikar @ 1.05.2014, 15:40:55 ) *
Oczywiście że da radę to samo zrobić z klasami, ale wtedy wówczas to są pseudo przestrzenie nazw. Tylko że powstało coś takiego jak PSR-0 i PSR-1 które niejako narzucają pewne standardy, dzięki czemu ja w ogóle nie znając kodu, otwieram go i z łatwością czytam, nie muszę się domyślać o co autorowi tego kodu chodziło itp. Dzięki standardom łatwiej pracuje się w grupach nad jednym kodem a i później ów kod łatwiej jest refaktoryzować.


Dzięki, już jestem coraz bliżej odpowiedzi na moje pytanie. Ale jeszcze jedno:czytałem kiedyś to PSR-0 i z mojego doświadczenia wynika, że nikt z tego nie korzysta, poza frameworkami zend i symfony. Te frameworki spadają jeśli chodzi o popularność. Czy tak w praktyce, w pracy w zespole to jest aż tak ważne? Nigdy nie forkowałem niczego na githubie, ale pracuję w pewnej firmie, używamy tam codeignitera i nigdy nie mieliśmy problemów z konfliktem nazw. Chociaż używaliśmy różnych bibliotek, to były zamknięte w klasach i prawdopodobieństwo powtórzenia się nazwy danej klasy oceniam na 0. A nawet jakby, to byśmy zamknęli je w namespace.

Tak więc, raz jeszcze, jak Tobie pomagają namespaces, np. to, że są kompatybilne z SPR-0
by_ikar
Znaczy możliwość powtórzenia to jest tylko jedna rzecz, bo tutaj głównie w przypadku przestrzeni nazw chodzi o porządek i autoładowanie. Co prawda można już teraz coś takiego osiągnąć stosując pseudo przestrzenie nazw, poprzez odpowiednie nazywanie klas (np Zend_DB etc). W CI przykładowo tez masz podział na katalogi (podobny do tego który zaleca PSR-0), tylko klasy wykorzystują pseudo przestrzenie nazw, ponieważ sam CI jest dość stary.

Nie myśl że to jakieś udziwnienie PHP, bo w innych językach z których php czerpie pełnymi garściami nie ma niczego innego poza przestrzenią nazw.

Też się kiedyś do tego nie mogłem przekonać do czasu aż nie zacząłem tego stosować, dzisiaj bez namespace jest bezsensu. Można powiedzieć że to dodatkowa robota - jak się klepie w notatniku może i owszem, ale w konkretnym IDE on te wszystkie USE sam ci wrzuca do pliku, dodatkowo już tworząc plik sam tworzy przestrzeń nazw względem tego w którym katalogu ów plik tworzysz.
Crozin
Cytat
[...] Zresztą, istnieją w jakimkolwiek języku klasy statyczne?
Tak, np. w Javie.

Podstawowe pytanie. Czytałeś w ogóle dokumentację? http://www.php.net/manual/en/language.namespaces.php Przecież masz tam jasno podane przykłady funkcjonalności, których nie da się uzyskać przy pomocy protez w formie metod statycznych w klasach.
A standardy PSR-0/-1 nie są wspierane tylko przez Zenda/Sf, a przez większość w miarę dobrze napisanych bibliotek/fw.
konrados
Cytat(Crozin @ 2.05.2014, 09:51:21 ) *
Tak, np. w Javie.

Podstawowe pytanie. Czytałeś w ogóle dokumentację? http://www.php.net/manual/en/language.namespaces.php Przecież masz tam jasno podane przykłady funkcjonalności, których nie da się uzyskać przy pomocy protez w formie metod statycznych w klasach.
A standardy PSR-0/-1 nie są wspierane tylko przez Zenda/Sf, a przez większość w miarę dobrze napisanych bibliotek/fw.


Jeśli chodzi o Javę, to pierwsze co znalazłem to to na stackoverflow:
Cytat
If you make all the members and functions of a Java class static then it is in effect a static class but there's no way of making a top-level class static


W ten sposób to w prawie każdym języku mamy "static classes" i rozumiem, że o to Tobie chodziło.

A propos tych standardów to muszę posiedzieć nad nimi, bo choć wiedziałem, że istnieją, to wydawało mi się zawsze, że korzystają z tego tylko jacyś "nerdzi":)

Dzięki.

@by_ikar
Dzięki za obszerne wyjaśnienie. Siadam do tych standardów dzisiaj:)

Edit: Znalazłem jeszcze jedną zaletę na stackoverflow:

Cytat
The thing with static classes to simulate namespaces is that you can't organize them across multiple files, everything has to be defined inside one file; this may well be up to personal taste.
Crozin
Cytat
[...] W ten sposób to w prawie każdym języku mamy "static classes" i rozumiem, że o to Tobie chodziło.
Nie, chodziło o
  1. static class Abc { ... }
Ale to nie ma żadnego związku z PHP czy metodami statycznymi.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.