Results 1 to 15 of 15

Thread: Hardcore PHP

  1. Back To Top | #1

    Post Hardcore PHP

    Sal'tare lume buna.

    Pentru cei interesati in programarea PHP (si care au si un background de programare destul de intemeiat) cateva point-uri din experienta proprie:

    1. Folositi cu incredere PEAR (http://pear.php.net). In afara faptului ca gasiti cam tot ce va doreste inimioara, impune si coding standards pe masura si e suportat si pe viitor.

    2. Pentru acces la baze de date, folositi una din bibliotecile PEAR (PEAR:B, MDB, etc). Va va scuti de scris cod si, mai important, ofera suport pentru o mare varietate de baze de date (MySQL, PostgreSQL, Oracle, etc) intr-o mariera independenta de platforma. Cu alte cuvinte, daca din motive obiective veti fi nevoiti sa folositi PostgreSQL in loc de MySQL, nu va trebui sa rescrieti jumatate din aplicatie .

    3. Nu amestecati PHP cu HTML. Pe termen lung alegeti-va un engine de template-uri (Smarty, etc) si folositi-l cu incredere.

    Asa nu!
    Code:
    <?php
    $x = 1/2;
    ?>
    <div align="right">
    <?php echo $x; ?>
    </div>
    4. Folositi clase (stiu, stiu... PHP 4 nu e orientat obiect cu adevarat ). Oricum, daca incapsulati codul in clase cu interfete bine definite, pe termen lung o sa va felicitati de 3 ori pe zi.

    5. NU variabilelor globale. Daca aveti ceva de facut, scrieti o functie, de exemplu:

    Asa nu!
    Code:
    $my_var = preg_replace('/a/is', 'b', $_SERVER['REQUEST_URI']);
    ...
    $template_engine->assign('output', $my_var);
    Asa da!
    Code:
    function processRequestURI()
    {
      return preg_replace('/a/is', 'b', $_SERVER['REQUEST_URI']);
    }
    ...
    $template_engine->assign('output', processRequestURI());
    Ideea e ca la un moment dat, intr-unul din include-uri o sa definiti inca o data $my_var ca fiind data curenta , si doua zile o sa va smulgeti parul intrebandu-va de ce saptamana trecuta functiona si acum nu.

    6.
    7.
    ...

    De la punctul 5 incolo sunt chestiuni legate de programare in general, chestiuni pe care se presupune ca le stapaniti deja .

    Numa' bune!
    People ask for criticism, but they only want praise.
    W. Somerset Maugham (1874 - 1965).

  2. Back To Top | #2
    brava . unde lucrezi ?

    apropo , cum faci clase in php ? cum le folosesti ?

    thanks

  3. Back To Top | #3
    Quote Originally Posted by Dukatu
    brava . unde lucrezi ?

    apropo , cum faci clase in php ? cum le folosesti ?

    thanks
    Problema cu clasele in PHP este ca ele nu exista .

    De fapt exista, dar sunt mai mult o constructie sintactica decat OOP cu adevarat.

    Ce lipseste (lista e incompleta, dar e ce ma doare):

    1. Function overloading:

    C++
    Code:
    class X 
    {
    function x(int a, char* b)
    {
    ....
    }
    function x()
    {
    ....
    }
    }
    Codul de mai sus va determina compilatorul C++ sa genereze doua functii distincte numite x, alegerea functiei care va fi apelata facandu-se la compilare, in functie de numarul si tipul parametrilor.

    Nu exista asa ceva in PHP.

    2. Lipsa destructorilor.

    3. Lipsa posibilitatii de a marca membrii ca privati/publici.

    etc

    Obiecte in PHP:

    Code:
    class Base
    {
    	var $x;
     
    	function process()
    	{
    		$this->x = 1;
    	}
    }
     
    class Derived extends Base
    {
    	function process()
    	{
    		$this->x = 2;
    	}
    }
     
    $object = &new Base();
    $object->process();
    var_dump($object->x);
    // rezultat:
    // 1
     
    $object = &new Derived();
    $object->process();
    var_dump($object->x);
    // rezultat:
    // 2
    Un ochi atent va observa un & bizar in codul de mai sus .

    Ideea este cam asa: in PHP assignment-ul se face prin valoare si nu prin referinta. Cu alte cuvinte:

    $object = new Base(); inseamna 'construieste un obiect de clasa Base, fa o copie dupa el si asigneaz-o variabilei $object'.

    $object = &new Base(); inseamna 'construieste un obiect de clasa Base si asigneaza variabilei $object o referinta catre el'.

    De asemenea, pe acelasi considerente, snippet-ul de mai jos nu functioneaza cum ar parea ca o face:

    Code:
    $object1 = new Base();
    $object1->x = 1;
    // aici => $object1->x == 1
    $object2 = $object1;
    $object2->x++;
    // aici => $object2->x == 2 DAR $object1->x == 1
    Asta se intampla pentru ca dupa assignment-ul $object2 = $object1, $object2 va fi O COPIE a lui $object1, si nu o referinta catre el.

    Intr-o functie membru (metoda), $this este o referinta catre instanta obiectului pe baza careia s-a apelat functia.

    Functiile membru se pot apela si static, caz in care $this === null.

    Code:
    class X
    {
    	var $x;
     
    	function X()
    	{
    		 $this->x = 12345;
    	}
     
    	function whatever()
    	{
    		if ($this === null)
    			echo 'STATIC';
    		else
    			echo $this->x;
    	}
    }
     
    $object = &new X();
    $object->whatever();
    // rezultat 
    // 12345
     
    X::whatever();
    // rezultat 
    // STATIC
    In rest, lucrurile functioneaza cam ca in alte limbaje (zis) OOP.

    Cam atat, la prima strigare .
    People ask for criticism, but they only want praise.
    W. Somerset Maugham (1874 - 1965).

  4. Back To Top | #4
    Registered User CyberCaster's Avatar
    Join Date
    Oct 2002
    Location
    I.P. pah stinga
    mai ideea e ca daca vrei ceva mai pe clase foloseste un perl ... mi se pare mai bun... daca vrei ceva mai rapid foloseti php.. iar daca vrei ceva foarte sigur iei si faci in perl
    Jealousy, the green eyed Monster!

  5. Back To Top | #5

    Question

    PERL !? clase !? OOP !?

    I'm puzzled
    People ask for criticism, but they only want praise.
    W. Somerset Maugham (1874 - 1965).

  6. Back To Top | #6

  7. Back To Top | #7
    Quote Originally Posted by aaroman
    Atacul martienilor. Adica aia cu scarba de limbaje de scrpting si alte asemenea .

    Ok, in acceptiunea de acolo 90% din ce se numeste limbaj de programare procedural e OO. Citez:

    Unlike say C++, Perl doesn't provide any special syntax for class definitions. You use a package as a class by putting method definitions into the class.

    There is a special array within each package called @ISA, which says where else to look for a method if you can't find it in the current package. This is how Perl implements inheritance. Each element of the @ISA array is just the name of another package that happens to be a class package.
    Unlike say C++, Perl doesn't provide any special syntax for method definition. (It does provide a little syntax for method invocation though. More on that later.) A method expects its first argument to be the object (reference) or package (string) it is being invoked on. There are two ways of calling methods, which we'll call class methods and instance methods.
    Get real. PHP, strict vorbind, nu e OO, cu atat mai putin ceva ca ce ati citit mai sus.

    Acum ai inteles ?
    People ask for criticism, but they only want praise.
    W. Somerset Maugham (1874 - 1965).

  8. Back To Top | #8
    trademark bj's Avatar
    Join Date
    Apr 2003
    Location
    On-Line
    sau puteti incerca Java
    Astazi sunt un invingator!

    Intel PIV 2,67 GHz Boxed FSB 533 | Gigabyte GA-8IPE1000-L (Rev 2.0) | 1GB DDRAM | Gygabyte Ati Radeon 9200 128/128 GV-R92128DH | 80 GB @ 7200 rpm Maxtor | DVD-RW Teac | 19" Trinitron Compaq P910

  9. Back To Top | #9
    Banned aaroman's Avatar
    Join Date
    Sep 2003
    Location
    World
    Adica aia cu scarba de limbaje de scrpting si alte asemenea
    Scarba nu inseamna ca nu am idee cat de cat de ele, sau ca n-am lucrat cu asa ceva.

    Citatele alea trebuie citite asa:
    1. "Perl doesn't provide any special syntax for class definitions" It doesn't need to, it uses packages for that.
    2. "which says where else to look for a method if you can't find it in the current package" Adica daca ai definit metoda in clasa asta, ok, daca nu se uita in clasa parinte. Cum crezi ca merg treburile in alte limbaje? Se construiesc tablele de pointeri la functii si alde alea, da' in principiu, asta-i ideea.
    Chestia asta trebuia sa-ti sugereze ceva:
    This is how Perl implements inheritance. Acuma te legi si de modul de implementare? Ala ar trebui sa fie indiferent utilizatorului
    3. "Perl doesn't provide any special syntax for method definition" Inca odata, nu are nevoie.
    4. "A method expects its first argument to be the object (reference) or package (string) it is being invoked on"
    Ok, si C++ si Java si C# nu primesc ca prim argument obiectul pe care sunt invocate? Diferenta e ca lucrul asta se face automat, si nu le vezi explicit in definitia metodei...

    Get real. PHP, strict vorbind, nu e OO, cu atat mai putin ceva ca ce ati citit mai sus.
    Get real. In functie de cine scrie, nimic nu e OO, in afara de Java Sau Smalltalk. Sau Eifell. Sau C++. Bineinteles ca PHP, sau mai ales Perl suporta mai putin programarea orientata pe obiect decat Smaltalk. Dar daca stii sa programezi si C-ul e OO Daca nu-ti ajung caracteristicile sarace ale limbajelor pe nume Perl sau php, alege unul bogat in caracteristici, de exemplu C++, ca tot nu-ti place tie

    Cam multe mofturi, ba are prea multe, ba are prea putine... Noroc ca java si C# au exact atat cat trebuie? Apropo, pentru ce?

  10. Back To Top | #10
    Registered User Zircon's Avatar
    Join Date
    Mar 1999
    Location
    Bucuresti
    Inca o discutie ruinata ... aaroman, ia citeste cum se numeste topic-ul acesta ...

    Lasa-l pe arond sa explice oamenilor ce si cum. Discutiile despre C#/Java/C++, OO, samd nu isi au locul AICI! Vreau sa iau link-ul si sa-l trimit unei anumite firme, spre documentare

  11. Back To Top | #11
    Banned aaroman's Avatar
    Join Date
    Sep 2003
    Location
    World
    Trebuia sa citeasca cum se numeste topicul chiar autorul topicului N-am vrut decat sa-l lamuresc cum e cu obiectele in perl, ca era tare surprins
    Lasa-l pe arond sa explice oamenilor ce si cum.
    Ar fi bine daca ar explica corect.
    Discutiile despre C#/Java/C++, OO
    C++ & OO n-au aparut prima data aici in postul meu.
    Si apropo de C++, autorul stie ceva php, si aplica aia si la C++, cand "compara" cele doua limbaje, explicand ce si cum:

    class X
    {
    function x(int a, char* b)
    {
    ....
    }
    function x()
    {
    ....
    }
    }

    Bineinteles ca asa ceva functioneaza, daca "function" e un tip. Insa in nici un caz nu e cuvant cheie, ca-n php... Poate a facut un
    typdef void function;
    inainte? Yeah, right...

  12. Back To Top | #12
    Quote Originally Posted by aaroman
    Bineinteles ca asa ceva functioneaza, daca "function" e un tip. Insa in nici un caz nu e cuvant cheie, ca-n php... Poate a facut un
    typdef void function;
    inainte? Yeah, right...
    Mea culpa . Corectura:

    Code:
    typedef int function; 
     
    class X 
    {
    function x(int a, char* b)
    {
    ....
    }
    function x()
    {
    ....
    }
    }
    E multumit Aaromanu ?

    Iar in ce priveste PERL si OO, in acceptiunea de acolo ORICE limbaj de scripting poate fi privit ca OO (si multe din cele compilate, chiar si C cu un pic de efort... ba, daca ma gandesc mai bine, si limbajul de asamblare poate fi OO, cu un macroasamblor destept ).

    [d'astea trimiti pe pm, ok?]
    Last edited by Karg; 15-02-2004 at 21:22.
    People ask for criticism, but they only want praise.
    W. Somerset Maugham (1874 - 1965).

  13. Back To Top | #13
    Ehh, revenim la partea constructiva. Azi, despre secvente in PEAR::DB.

    Problema se pune in felul urmator: folositi o baza de date, si simtiti o nevoie compulsiva de a folosi, intr-un tabel, un camp autoincrement. Fiind axati pe MySQL, o sa scrieti ceva de genul:

    Code:
     
    CREATE TABLE `table` (
      `id` int(11) NOT NULL auto_increment,
      ...
      PRIMARY KEY  (`id`)
    );

    Asta inseamna, bref, ca la fiecare insertie in tabel, daca valoarea pentru campul `id` este NULL sau nu este specificata, MySQL va genera automat o valoare unica pentru acel camp. O utilizare foarte buna pentru asa ceva este generarea valorilor pentru un camp care este cheie primara a tabelului.

    Singura problema este ca treaba asta nu e portabila. In sensul ca, desi exista implementata pe multe DBMS-uri, in general felul in care se intampla e diferit de la un DBMS la altul.

    Din fericire, PEAR::DB asigura un mecanism portabil de generarea automata de valori, in stilul de mai sus. Acest mecanism se numeste 'secventa', si este oferit nativ de unele DBMS-uri (s-ar putea chiar sa faca parte din standardul SQL2, nu sunt sigur).

    PEAR::DB emuleaza secventele prin functia nextId(), membru al clasei database:

    [PHP]
    function nextId($seq_name, $ondemand = TRUE)
    {
    ...
    }
    [/PHP]

    unde:

    $seq_name - numele secventei
    $ondemand - daca e TRUE, in cazul in care secventa nu exista, ea va fi creata

    Fiecare secventa e independenta de celelalte, si in principiu functioneaza ca si auto_increment in MySQL (genereaza identificatori in ordine).

    Ca implementare, in general se creeaza un tabel in care se tine minte urmatoarea valoare de generat. Numele tabelului asociat unei secvente este implicit nume_secventa.'_seq' (secventa numita Unu va genera un tabel numit Unu_seq).

    Modul de folosire e trivial, si asigura compatibilitatea cu cea mai mare a DBMS acoperite de PEAR::DB.

    Exemplu (din manualul PEAR):

    [PHP]
    <?php
    ...
    // Urmatorul ID din secventa 'my Sequence'
    // (daca secventa nu exista, ea va fi creata)
    $id = $db->nextId('mySequence');
    // Foloseste ID-ul intr-un INSERT
    $res = $db->query("INSERT INTO myTable (id,text) VALUES ($id,'foo')");
    ...
    ?>

    [/PHP]
    In felul asta puteti auto-genera valori pentru campurile dorite intr-un fel independent de de DBMS-ul folosit.
    People ask for criticism, but they only want praise.
    W. Somerset Maugham (1874 - 1965).

  14. Back To Top | #14
    Registered User
    Join Date
    Mar 2017
    Location
    Cluj-Napoca, Romania
    Multumesc mult! Inca-s la inceput cu programarea dar asta cu clasele n-am inteles-o pana acum.

  15. Back To Top | #15
    E putin cam vechi acest thread recomand sa cauti referinte mai noi daca vrei sa inveti.

  1.  

Bookmarks

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •