Wpis z mikrobloga

@kam1ll: Powiedz, co rozumiesz (lub wydaje Ci się, żę rozumiesz), a czego nie ogarniasz, to Cie wyprowadzimy z błędu lub wyjaśnimy.
Tak to mogę Ci jedynie napisać do samo, co jest napisane w tysiącu miejsc w necie, a nie o to chodzi przecież.
@kam1ll: Namespacy czyli przestrzenie nazw służa do grupowania i unikania konfilktu nazw. Wyobraź sobie że masz dwie Marysie. Jeśli zawołasz "Marysia" to będzie to niejednoznaczne. Ale wiesz że jedna Marysia jest z Zabrza a druga z Chorzowa. Możesz więc zawołać "Marysia z Chorzowa" i to będzie jednoznaczne. W tym wypadku miasto(Chorzów) jest namespacem, przestrzenią nazw.

W PHP namespace wygladało by to tak:

php
namespace Zabrze;
class Marysia { /* .. */}
Aby potem użyć Marysi napiszesz: Zabrze\Marysia


@Passer93: czyli

$var = new Zabrze\Marysia;
tak? i to importuje całą klasę? jak to wygląda z funkcjami itp.?

@kam1ll: Powiedz, co rozumiesz (lub wydaje Ci się, żę rozumiesz), a czego nie ogarniasz, to Cie wyprowadzimy z błędu lub wyjaśnimy.

Tak to mogę Ci jedynie napisać do samo, co jest napisane w tysiącu miejsc w necie, a nie o to chodzi przecież.


@zakopiak: ja
@kam1ll:
$var = new Zabrze\Marysia; to po prostu utworzenie obiektu w pamięci i przypisanie go do zmiennej $var przez referencje. Nie za bardzo wiem co rozumiesz przez "import całej klasy".

Dla funkcji namespace działają identycznie, możesz o nich myśleć jak o części nazwy/identyfikatora. Cała nazwa to "Zabrze\Marysia" albo "Zabrzy\funkcja1()" i przestrzeń nazw jest po prostu jej częścią.
@Passer93: https://symfonycasts.com/screencast/php-namespaces/namespaces

generalnie trzeba napisać w bólach kilka tyś lini kodu z namespaceami, napotkać i rozwiązać kilkaset problemów z użyciem dokumentacji. Tak jak w nauce matematyki, jeszcze nikt się nie nauczył ucząc się z gotowych rozwiązań, matematyki uczy się mając zadania i samemu dochodząc do rozwiązań. Ewentualnie pytając o jakiś konkretny road block którego się nie rozumie.
@kam1ll:
Po pytaniu o import klasy. Nie mieszasz autoloadingu z samym konceptem namespaców?

$var = new Zabrze\Marysia
To Ci tworzy obiekt klasy, a nie jakiś import. Pokaż swój kod i co chciałeś zrobić.
@kam1ll: Uwaga, będzie długo :D

tak? i to importuje całą klasę?


Pomyśl o tym trochę inaczej.
Namespace, to część nazwy klasy. Nazwa klasy z namespacem to tzw. "full qualified (class) name". Można się też spotkać ze skrótami FQN lub FQCN.

Także pisząc Zabrze\Marysia odnosisz się do tej klasy pod tym namespacem i tyle. Nie myśl o żadnym importowaniu.

Jeśli z kolei zrobisz

use Zabrze\Marysia
$var = new Marysia();


Bo będzie to
@zakopiak: na początku dzięki, że poświęciłeś mi czas, czyli, że teraz już nie używamy include, require, require_once, i teraz tak - jak chce się odwołać do tego to muszę to w tym composerze też "ująć", żeby wiedział, że się znajduje akurat tam ten plik? czy jak? np. chce połączenie z bazą danych zrobić akurat w oddzielnym pliku i odnieść się tam, czyli obstawiam, że to jest klasa + funkcja

@kam1ll: Obecnie zalecany standard autoloadingu, to PSR-4. Polega on na tym, że dla bazy kodu znajdującej się z jednym folderze (np całe src) masz prefix (najczęściej jakaś nazwa vendora, lub vendora + nazwy paczki), i wtedy w src masz pliki z klasami fizycznie poukładane zgodnie z nazwami namespace'ów ( z pominięciem prefixa).

Dalej w composer.json wpisujesz sobie odopwiednią konfigurację (jedna linia dla całego folderu), wskazującą jakis prefix namespace'a (np. \Vendor\SomeProject
@kam1ll: Jeszcze ciekawostka mi przyszła do głowy.

Używanie samej nazwy klasy (bez próby utworzenia jej instancji), nie da Ci błędu.

Także jak zrobisz: use Klasa\Której\Nie\Ma; To nic złego się nie dzieje, bo to tylko informacja "składniowa", że "uwaga jeśli użyję klasy "Ma", to mam na myśli tę klasę". Ale dopóki jej faktycznie nie użyjesz, to nie będzie błędu, bo autoloading ma miejsce dopiero, gdy faktycznie używasz tej klasy, tj.
@kam1ll: Zmień hosting. ( ͡° ͜ʖ ͡°)

Tak bardziej serio, to "profesjonalnie" to robi się to tak, że proces deploy'u obejmuje również etap budowania projektu. Tak samo pewnie nie masz na hostingu innych narzędzi, jak np. Node.js, npm itp do budowania LESS/SCSS, czy innych JSów. Dlatego możesz robić to lokalnie i uploadować "gotowy produkcyjnie" projekt. Sa oczywiście również narzędzia do automatyzacji procesu wdrażania, ale to już inny
$var = new Zabrze\Marysia;


@kam1ll: to tworzy obiekt danej klasy, jakie metody dodasz do tej klasy i ustawisz ich widoczność jako publiczne tak takie będziesz miał dostępne z tego kontekstu

do tego samo out of box się nie załaduje - potrzebny ci jeszcze autoloader, najlepiej skorzystać tego z composera

A i nie potrzebujesz hostingu aby odpalać phpa, możesz to robić lokalnie :)