Cum sa folosesc namespace-urile corect ? Topic is solved

PEAR, Smarty, ADOdb, OOP, PHP 5, XML, UML, Şabloane de proiectare, PHP-GTK.

Moderatori: coditza, Emil, Moderatori

Dexter89
New Member
Mesaje: 1
Membru din: Vin Iul 01, 2016 2:36 am

Cum sa folosesc namespace-urile corect ?

Mesajde Dexter89 » Sâm Apr 22, 2017 10:56 pm

Salutare,

Nu inteleg namespace-urile de nici un fel.

Deci, sa spunem ca am 2 clase / 2 fisiere.

In primul fisier am clasa numita Admin

In al doilea fisier am clasa numita tot Admin

Daca le setez namespace-uri, atunci ... cand le apelez, n-o sa le mai chem cu Admin::functia_mea(), ci cu namespace inainte. Corect ?

Daca da, atunci nu mai bine imi denumesc clasele altfel ?

Mai rau ma incurca namespace-urile...

Sunt incepator in oop. Nu ma prind cu ce ma ajuta namespace-urile.

Mai exact:

Am acum 3 fisiere:

Admin.php
Admin_Set.php // Contine o clasa Admin cu anumite metode
Admin_Get.php // Contine o clasa Admin cu alte metode (nume diferite fata de ce contine prima clasa)

Iar atunci cand folosesc o clasa, vreau s-o fac in felul urmator:

Admin::Metoda_din_Admin_Get()
Admin::Metoda_din_Admin_Set()

Ati inteles ?

Ca, altfel, pot sa le carpesc. Numesc o clasa Admin_Get si o clasa Admin_Set.

Ma gandeam ca folosind Admin::metoda_x_din_fisierul_x arata mai bine si e mai profesionist. Sau ... ?

Problema mea reala este ca pana acum aveam o singura clasa intr-un singur fisier... numai ca fisierul asta s-a marit atat de mult incat cred ca ar trebui sa separ putin codul in fisiere diferite.



takedown
Average Member
Mesaje: 153
Membru din: Joi Feb 07, 2013 8:50 pm
Contact:

Re: Cum sa folosesc namespace-urile corect ?  Topic is solved

Mesajde takedown » Lun Apr 24, 2017 12:58 pm

Namespace-ul te ajuta sa eviti coliziunea dintre doua clase ce au acelasi nume.Crede-ma, desi pare imposibil, atunci cand vei folosi librarii scrise de alte persoane, vei intampina aceasta problema mai mult ca sigur.

Voi incerca sa-ti explic despre ce-i vorba.

In primul rand, creaza fisierul index.php, apoi creaza un folder, sa-i zicem Libraries.In acest folder vei crea alte doua foldere, Mailer si MailHelper.In ambele foldere adauga fisierul Mail.php.

- Mail.php ( continutul acestui fisier, care de altfel este o clasa )

Cod: Selectaţi tot

<?php

class Mail
{   
    public function send()
    {
        // send email
    }
}


Acum, in index.php daca executi codul de mai jos vei intampina acea coliziune.

index.php

Cod: Selectaţi tot

<?php

require __DIR__ . '/Libraries/Mailer/Mail.php';
require __DIR__ . '/Libraries/MailHelper/Mail.php';

$mail = new Mail();


Fatal error: Cannot declare class Mail, because the name is already in use in C:\xampp\htdocs\test\Libraries\MailHelper\Mail.php on line..


Pentru a evita o astfel de probleme, trebuie sa adaugam clasa Mail.php din ambele foldere intr-un namespace propriu.Se obisnuieste ca namespace-ul unei clase sa imite structura directoarelor catre acea clasa.

- Pentru clasa Mail.php aflata la locatia Libraries/Mailer/ vom avea urmatorul namespace: namespace Libraries\Mailer;

Cod: Selectaţi tot

<?php

namespace Libraries\Mailer;

class Mail
{
    public function send()
    {
        // ..
    }
}


- Pentru clasa Mail.php aflata la locatia Libraries/MailHelper/ vom avea urmatorul namespace: names[/code]pace Libraries\MailHelper;

Cod: Selectaţi tot

<?php

namespace Libraries\MailHelper;

class Mail
{
    public function send()
    {
        // ..
    }
}


Dupa cum poti observa, namespace-ul se adauga inainte de orice altceva si se adauga folosind cuvantul predifinit namespace urmat de un nume pentru acel namespace.

Acum, in fisierul index.php, putem instantia ambele clase Mail.php specificand namespace-ul in care aceste clase se afla.

Cod: Selectaţi tot

<?php

require __DIR__ . '/Libraries/Mailer/Mail.php';
require __DIR__ . '/Libraries/MailHelper/Mail.php';

$mail1 = new \Libraries\Mailer\Mail();

$mail2= new \Libraries\MailHelper\Mail();


Dupa cum poti observa, atunci cand instantiam o clasa ce se afla intr-un namespace, mai intai scriem namespace-ul in care se afla si apoi, in final, adaugam numele acelei clase.

Mai sunt multe de discutat despre acest concept, dar ai un punct de unde poti pleca.

Apropo, nu este ceva super folositor sa ai o metoda pe clasa.Cand vorbim de OOP, stim ca acest stil de programare se bazeaza pe conceptul de clase si obiecte.Ei bine, dupa cum stim, clasa este un fel de sablon, folosit pentru crearea de obiecte, obiectul fiind modul prin care putem interactiona cu ceea ce am scris intr-o clasa.Mai stim ca dintr-o clasa putem crea unul sau mai multe obiecte de sine statatoare.

Acest stil de programare prespune organizarea si gruparea variabilelor si functiilor ce se ocupa de o sarcina anume, intr-o clasa.De exemplu, pentru inregistrare utilizatorilor pe un site, poti avea o clasa ce reprezinta un utilizator, sa zicem User.php, poti avea o clasa pentru interactionarea cu baza de date, sa zicem DB.php, mai poti avea o clasa ce se ocupa cu inregistrarea propriu zisa, sa zicem, Register.php, aceasta clasa folosindu-se de celelalte doua pentru a duce la bun sfarsit aceasta sarcina, inregistrarea utilizatorilor.


Înapoi la “PHP Avansat”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 35 vizitatori