Avatar billede -zonic- Nybegynder
28. august 2009 - 13:53 Der er 34 kommentarer og
2 løsninger

Fordele ved Object oriented php ?

Hej,

Efter at have haft java programmering på mit studie har jeg efterfølgende studeret oop med php som egentlig ligner ret meget strukturmæssigt.. jeg koder normalt alm php både inline og med functions, men jeg kunne godt tænke mig at høre et par eksperter om man overhovedet får noget ud af at bruge oop php?

Det jeg ikke helt kan se fidusen ved er, at objekterne jo kun lever mens en side loades, hvorimod de ved java jo lever så længe programmet kører...

hvad er det man kan bruge objekter til ved alm. webprogrammering når man ikke engang efterfølgende når siden er loaded kan eksekvere funktioner på objekterne?

det er vel ikke sådan at man bare skal gemme objekterne i sessions og så arbejde med dem derfra?

På forhånd tak! :-)

PS. Jeg uddeler en del point til dette spørgsmål i håb om at få en gode inputs til hvad jeg kan få ud af at bruge oop! :-)
Avatar billede arne_v Ekspert
28. august 2009 - 14:28 #1
OOP giver pænere kode som er nemmere at vedligeholde.

Når projektet når over en vis størrelse.

Samme årsager som i Java.

Objekt levetid ændrer ikke på det.
Avatar billede -zonic- Nybegynder
28. august 2009 - 15:11 #2
... men vi er enige om at hvis jeg loader en side f.eks:


$bruger = new bruger();

$bruger->setName('Arne');



så kan jeg ikke lave et link på den side som bare henviser til mit objekt $bruger med funktionen setName?

det ville jeg jo kunne i java!

det er der jeg synes idéen går lidt af det?
Avatar billede arne_v Ekspert
28. august 2009 - 15:23 #3
Hoved ideen i OOP er at:
- du modellerer virkeligheden
- du exposer public interraces og encapsulater adgangen til private implementation
o.s.v.
Avatar billede -zonic- Nybegynder
30. august 2009 - 14:33 #4
og på dansk betyder det? :-)


og så svarede du ikke rigtigt på mit indlæg?
Avatar billede arne_v Ekspert
31. august 2009 - 14:44 #5
Det betyder at genbrug af objekter mellem requests ikke er en betingelse eller en af de stoerre fordele ved OOP.
Avatar billede -zonic- Nybegynder
08. september 2009 - 22:26 #6
men hvad er så en af de store fordele?  jeg kan jo bare bruge functions uden at bruge objekter.. det er da vel lige så strukturmæssigt en gevinst?
Avatar billede arne_v Ekspert
08. september 2009 - 22:37 #7
De store fordele er at:
- koden modellerer virkeligheden
- koden exposer public interfaces og encapsulater adgangen til private implementation
Avatar billede -zonic- Nybegynder
08. september 2009 - 22:37 #8
noget helt andet - når jeg skal gemme ting i min mysql database vil det jo igen ikke være objekter jeg gemmer, så jeg har lidt svært ved at se hvordan jeg kan få fordele ud af at bruge det, frem for blot funktioner?

Håber nogen kan give mig en kommentar som kan få mig til at se lyset :-)
Avatar billede arne_v Ekspert
08. september 2009 - 22:45 #9
Der findes faktisk objekt orienterede databaser.

Men typisk bruger man OOP sammen med relationelle databaser.

Og lever med at man maa skifte paradigme fra database til applikation.

Det er kendt som:
  http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch
Avatar billede arne_v Ekspert
08. september 2009 - 22:46 #10
Saa det er et problem. Men et problem som man kan leve med.
Avatar billede -zonic- Nybegynder
09. september 2009 - 00:13 #11
hmm.. okay... jeg savner bare noget der svarer lidt på mit spørgsmål... jeg kan stadig ikke se hvorfor det er smartere at operere i objekter end bare funktioner med variabler...?

Jeg står og skal til at genopbygge et loginsystem med forum, nyheder, debatter, kommentarer osv, og det kunne være rart at vide hvad oop kan give mig, som vil gøre det nemmere eller bedre end blot at kode det konventionelt eller blot med funktioner og variabler... og jeg synes bare ikke rigtigt jeg bliver klogere på det du har skrevet...? jeg savner én der kan sige, BUM - det er der her der gør det smartere... og det er der derfor du bør gøre det.... og variablerne gemmer du bare normalt i mysql'en... noget i den dur...  eller blot noget håndgribeligt der kan illustrere for mig hvad jeg får ud af det... for som jeg ser det, tager det længere tid at kode i første omgang.... og jeg kan stadig ikke se hvad objekterne giver mig som jeg ikke kan få ved functions....?
Avatar billede arne_v Ekspert
09. september 2009 - 01:22 #12
#3 og #7 forklarer
Avatar billede arne_v Ekspert
09. september 2009 - 01:23 #13
OOP kan sjældent betale sig ved små 3 siders hobby projekter. OOP kan betale sig ved større projekter med tusinder (eller millioner) af linie kode.
Avatar billede -zonic- Nybegynder
09. september 2009 - 10:26 #14
du bliver i hvertfald aldrig skolelærer... :)  - når jeg sidder og siger til dig at jeg ikke får noget ud af dine #3 og #7, så nytter det ikke noget at du bare siger "læs det igen"...

Jeg forstår ikke at det ikke bare kan forklares med egne ord hvad fordelene er, og så evt svare på mine spørgsmål løbende :)

bla.:



- men hvad er så en af de store fordele?  jeg kan jo bare bruge functions uden at bruge objekter.. det er da vel lige så strukturmæssigt en gevinst?
Avatar billede arne_v Ekspert
09. september 2009 - 15:21 #15
Det kan godt vaere at mine evner ikke raekker til at blive skolelaerer.

:-)

Men hvad er problemet med #3 og #7?

- koden modellerer virkeligheden

I #11 lister du jo selv en raekke klasser "med forum, nyheder, debatter, kommentarer" som det du vil lave. Virkeligheden er klasser.

Og det lyder vel plausibelt at kode som modellerer virkeligheden er nemmere at forstaa og vedligeholde end kode der er modellerer hvordan en CPU fungerer.

- koden exposer public interfaces og encapsulater adgangen til private implementation

Det kan du jo ikke lave paa samme maade med funktioner og variable.

Og det er smart. Det goer det meget nemmere at vedligeholde koden. Men i et vist omfang bliver du noedt til at stole paa at alverdens udvikleres erfaring over et par aartiers har en vis validitet.
Avatar billede olebole Juniormester
09. september 2009 - 22:31 #16
<ole>

Jeg er et objekt - en instans af klassen Menneske:

$olebole = new Menneske();


Jeg har egenskaber/properties: Køn, alder, krop (som i sig selv er et objekt, med masser af metoder og properties, som igen kan være objekter, som har ...), osv.
Nogle af disse egenskaber får mine omgivelser at se, mens andre er meget private - men de har ofte indflydelse på mine 'offentligt tilgængelige' egenskaber og ting, andre kan få mig til at udføre.

Jeg har også metoder (ting, jeg kan gøre): Spise, gå, skrive kode, osv. Også her gør jeg ting indeni og/eller i mit helt private liv, som har indflydelse på de ting, andre kan få mig til at gøre.

Jeg har properties og methods, som er både private og public. Det er endda lykkedes mig at instatiere tre child objekter, som alle har arvet nogle af mine egenskaber og metoder  =)

Alt omkring dig kan opfattes/beskrives som objekter - hvorfor OOP er en afspejling af vores måde at opfatte omgivelserne på. Derfor virker OOP ekstremt logisk, når man først har fået øje på, hvad det er.

"- koden modellerer virkeligheden" er Arnes yderst præcise måde at udtrykke det på.

Forestil dig et helt ultra simpelt eksempel. Du klikker ind på din profil her på E:


class User {
    // Her hentes bruger info
    // fra DB og sættes som
    // properties på objektet
}
$user = new User();



Så kan man i resten af dokumentet printe de forskellige properties ud med:


<tr>
    <td>Navn:</td>
    <td><?php print $user->name ?></td>
</tr>
<tr>
    <td>Adresse:</td>
    <td><?php print $user->address ?></td>
</tr>



Al din kode omkring det at vise en bruger er så samlet i én klasse - som sagtens kan gøre brug af andre klasser (f.eks. til DB håndtering). Du får samlet din kode i logiske blokke - og du holder dit globale namespace overskueligt. Din User klasse kan desuden extendes, hvis du i anden sammenhæng skal vise en bruger med flere informationer eller, hvad ved jeg?

Ved ikke, om det evt. hjælper lidt på forståelsen  =)

/mvh
</bole>
Avatar billede -zonic- Nybegynder
09. september 2009 - 22:33 #17
hehe.. jeg forstår bare ikke sætningen :

koden exposer public interfaces og encapsulater adgangen til private implementation


det er nok det der er problemet.. :)  - jeg stoler såmænd også på eksperterne... de skal bare lige have mig til at se lyset... :)
Avatar billede olebole Juniormester
09. september 2009 - 22:35 #18
PS: Det at gemme objekter kan til en vis grad godt lade sig gøre, men det er en lille flig af OOP
Avatar billede arne_v Ekspert
09. september 2009 - 22:39 #19
Avatar billede olebole Juniormester
09. september 2009 - 22:41 #20
#17 prøvede jeg at forklare med de af mine egenskaber og 'metoder', jeg lader andre se og interagere med - overfor egenskaber og 'metoder', som kun jeg kender til, og som ingen andre får direkte adgang til.

Jeg eksponerer et offentligt 'interface', som folk kan se, høre, føle, lugte, nogle få endda smage, samt interagere med.

Derudover har jeg en masse indeni, som får mig til at fungere, men som ingen udenforstående har direkte adgang til.
Avatar billede -zonic- Nybegynder
10. september 2009 - 14:25 #21
Mange tak til jer begge.. nu er jeg ved at have forstået principperne... det hjalp lidt med et praktisk eksempel - jeg er dog stadig lidt i tvivl om det er bedre for mig at bruge i mine php projekter ( som ellers for det meste er ret store sider ) men jeg går ud fra at den store forskel for mig der vil være at jeg i høj grad vil have nemmere ved at genbruge min kode både i samme projekt, men også til andre projekter?  :)

Men jeg er stadig lidt i tvivl om brugen af oop sammen med mysql ? som jeg ser det er det noget med at "objektifisere" nogle variabler fra f.eks. en bruger database....? jeg forestiller mig at jeg kunne lave en brugerklasse sådan her?.:


// Forslag til User Class
class User {
    var $user, $pw;
   
   
    function user() {
        if(isset($_SESSION['user']) && isset($_SESSION['pw'])) {
            //$this->log_in($_SESSION['user'], $_SESSION['pw']);
        }
    }
   
    function log_in($user, $pw) {
        $res = mysql_query("SELECT user, pw FROM "."login WHERE user = "."'$user' AND pw = "."'$pw'");
        if(mysql_num_rows($res) == 1) {
            $this->user = $user;
            $this->pw = $pw;
            $_SESSION['user'] = $this->user;
            $_SESSION['pw'] = $this->pw;
            return true;
        } else {
            $this->log_out();
            return false;
        }
    }
   
    function log_out() {
        if($this->logged_in()) {
            unset($this->user);
            unset($this->pw);
            $_SESSION = array(); // unset all session vars
            session_destroy();
            return true;
        } else {
            return false;
        }
    }
   
    function logged_in() {
        if(isset($this->user) && isset($this->pw)) {
            return true;   
        } elseif(isset($_SESSION['user']) && isset($_SESSION['pw'])) {
            $this->user = $_SESSION['user'];
            $this->pw = $_SESSION['pw'];
            return true;
        } else {
            return false;
        }
    }
   
    function add_user($user, $pw) {
        $res = mysql_query("SELECT user FROM "."login WHERE user = "."'$user'");
        if(mysql_num_rows($res) > 0) {
            return false; // do something
        } else {
            mysql_query("INSERT INTO login"."(user, pw)"." VALUES ('$user, "."'$pw')");
            return true;
        }
    }
   
    function del_user($user) {
        $res = mysql_query("SELECT user FROM "."login WHERE user = "."'$user'");
        if(mysql_num_rows($res) != 1) {
            return false; // do something
        } else {
            mysql_query("DELETE FROM login"." WHERE user = '$user'");
            return true;
        }
    }
   
    function getName() {
        if($this->logged_in()) {
            return $this->user;
        } else {
            return false;
        }
    }
   
    function change_pw($pw, $newpw) {
        if($this->logged_in()) {
            $res = mysql_query("SELECT pw FROM "."login WHERE user = "."'$this->user'");
            $row = mysql_fetch_array($res);
            if($row['pw'] = $pw) {
                mysql_query("UPDATE login"." SET pw = '$newpw'"." WHERE user='$this->user'");
                $this->pw = $newpw;
                $_SESSION['pw'] = $this->pw;
                return true;
            } else {
                return false; // Wrong password!
            }
        } else {
            return false; // Not logged in
        }
    }

}
// END   



hvis jeg så vil have adresse, navn, email osv i klassen, skal det så gøres med en metode for hver ala.:

function getName() {
        if($this->logged_in()) {
            $res = mysql_query("SELECT name FROM "."login WHERE user = ".$this->user.");
                    $row = mysql_fetch_array($res);
            $this->name = $row['name'];
                        return $this-name;
        } else {
            return false;
        }
    }

eller vil man blot hente alle oplysningerne når man logger ind med databasen og så sætte dem der som i .:


unction log_in($user, $pw) {
        $res = mysql_query("SELECT * FROM "."login WHERE user = "."'$user' AND pw = "."'$pw'");
        if(mysql_num_rows($res) == 1) {
                        $row = mysql_fetch_array($res);
            $this->user = $row['user'];
            $this->pw = $row['pw'];
            $this->email = $row['email'];
            $this->name = $row['name'];
            return true;
        } else {
            $this->log_out();
            return false;
        }
    }

og så bruge $user->getName(), $user->getEmail();

?



er jeg på rette vej i noget af det jeg har prøvet at lege med her? :-)
Avatar billede -zonic- Nybegynder
10. september 2009 - 14:25 #22
(jeg ved godt de sidste metoder ikke er defineret... det var bare mere princippet :-) )
Avatar billede arne_v Ekspert
11. september 2009 - 04:00 #23
Du mangler private/public angivelser i din klasse.

Klassen blander efter min mening to ting sammen. Jeg ville lave en klasse User som indeholdt oplysninger om username/password og en klasse UserManager som laver henter/gemmer/sletter brugere

Jeg synes ikke at dine metoder og dine fields i klassen spiller godt sammen. Du vil typiske give dine fields værdier i constructor og så lade metoder bruge dem.

Noget i stil med:
  UserManager load henter en User fra databasen
  User check tester om et angivet password er korrekt
Avatar billede arne_v Ekspert
11. september 2009 - 04:02 #24
Et par ting som ikke relaterer sig til OOP:

Din kode er pivåben for SQL injection.

Skift fra mysql til mysqli (naturligvis i den objektorientede udgave !!) og brug prepared statement.

Endvidere skal du overveje om du vil gemme password eller om du bare vil gemme en hash af password. Det sidste er langt sikrere.
Avatar billede arne_v Ekspert
11. september 2009 - 04:08 #25
Jeg er ikke erfaring nok i PHP til at kunne udtale mig om hvad der er bedst med hensyn til getter og setter.

Men lidt googling antyder at __set og __get magiske metoder er den tiltænkte måde at gøre det på.
Avatar billede -zonic- Nybegynder
11. september 2009 - 14:39 #26
jeg aner ikke hvad mysqli er? :-)  jeg plejer at bruge magic_quotes og så real_escape, er der en nemmere måde?
Avatar billede arne_v Ekspert
11. september 2009 - 15:08 #27
mysqli extension er en erstatning for mysql extension som er i PHP 5.0 og nyere.

Den supporterer prepared statements og har baade et OO og et proceduralt API.

GPC er noget bras.

mysql_real_escape_string eksisterer stadig i form af mysqli_real_escape_string, men prepared statement er bedre.
Avatar billede -zonic- Nybegynder
11. september 2009 - 15:13 #28
okay.. det anede jeg intet om... kan du give et hurtigt eksempel? :-)
Avatar billede arne_v Ekspert
11. september 2009 - 15:23 #29
Avatar billede arne_v Ekspert
13. september 2009 - 02:21 #30
og et svar fra mig
Avatar billede -zonic- Nybegynder
13. september 2009 - 13:39 #31
okay.. mange tak! og tak for hjælpen til jer begge!

Olebole smider du også lige et svar?
Avatar billede windcape Praktikant
13. september 2009 - 17:50 #32
Når du snakker om at gemme objekter i en database, er Object Relational Mapping (ORM) jo meget populært, og oven i hatten Active Record (AR).

http://framework.zend.com/ har et godt AR system, som tillader dig at mappe tabeller som objekter. Forestil dig at oprette en bruger med navn og email fra et POST request

$user = new User();
$user->name = $_POST['Name'];
$user->email = $_POST['Email'];
$user->save(); // gemmes i databasen

Det er noget nemmere end at skulle skrive SQL'en selv. Og en effektiv udnyttelse af objekter.

Du lyder til at være bekendt med databaser.

Forestil dig at:
- en tabel i en database representere en liste af objekter.
- kolonnerne i tabellen er properties.
- rækkerne er objekter der indeholder værdierne.
Avatar billede olebole Juniormester
13. september 2009 - 21:46 #33
=)
Avatar billede -zonic- Nybegynder
15. september 2009 - 01:49 #34
Mange tak for hjælpen :-)

Olebole-> hvordan laver du de der fancy blå borders rundt om din kode? :-)


Windscape-> ja, det ser fedt ud.. men jeg er kun vant til at bruge mysql og kender ikke så meget til det, så måske det er for meget at kaste sig ud i... det kræver vel også at min webserver understøtter det?
Avatar billede olebole Juniormester
15. september 2009 - 12:34 #35
Det er BB-kode, som det står beskrevet for Fed, Italic og Underline. Jeg laver blot et 'div-tag' med square brackets  =)
Avatar billede windcape Praktikant
15. september 2009 - 14:28 #36
> Windscape-> ja, det ser fedt ud.. men jeg er kun vant til at
> bruge mysql og kender ikke så meget til det, så måske det er for
> meget at kaste sig ud i... det kræver vel også at min webserver
> understøtter det?

Nej, det er ren PHP :) Kræver intet specielt fra din server, udover altså PHP5.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester