PHP 5 OOP ?

Tags:    php

<< < 12 > >>
Hej,

Jeg havde for nylig en debat i en irc chan on php's oop og hvordan jeg brugte det. De mente alle at den måde jeg benyttede oop på i php var forkert.

I php som de fleste af jer ved "slipper" man for at predefinere variabler. Der er ingen "int i;" eller lign.

Det der startede det hele var at jeg spurgte i denne chan om det var muligt at lave en class attribut private uden at have predefineret den. Altså sådan her:

Fold kodeboks ind/udKode 


Læg mærke til at jeg ikke har lagt en private $myvar; i toppen af min klasse.

Dette er i min verden ikke helt forkert, netop fordi at php er bygget rundt om det faktum, at man ikke behøver at predefinere variabler. Hvor er dette så nyttigt i oop spørger du ?
Jo jeg ville gerne benytte det således

Fold kodeboks ind/udKode 


Det der sker her er at jeg lave klasse attributer for hvert felt i databasen i tabellen "projects"

Er det mig der er fuldstændig idiot og er det her bare fy fy slemme ? Eller hvad mener i ?

Udover det blev jeg yderst upopulær i denne chan da jeg nævnte at jeg ikke mener at php 5 er 100% oop, hvad mener i om det ?

På forhånd tak.

- Simon



Jeg vil heller ikke sige at du kan bruge det sådan. Jeg vil mene at din variabel $myVar "forsvinder" da det ikke er noget som der peges på. Derfor skal du erklærer den i toppen.
Det der måske sker, er at den (lige som i "almindelig" php) sætter en lokal variabel til at indeholde dine data.

f.eks.:
Fold kodeboks ind/udKode 


- Har du prøvet at tilgå data i den variabel igen?

Derudover er det helle ikke smart, at din Project klasse leger med databasen direkte. Jeg ville bruge andre funktioner til at tilgå tingene, og så ellers ligge data op i dit objekt.

Jeg har prøvet at lave et lille "webshop" eksempel her.
Fold kodeboks ind/udKode 


Jeg har med vilje ikke brugt database, da jeg bare ville vise dig objekter.

Det jeg mener med det hele er, at objekter ikke må lave noget, som gør at de ikke kan bruges alle steder. (samme projekt, andre projekter osv.)
Et objekt skal bare være en beskrivelse og ikke vide hvordan den selv henter sin data osv.


Jeg burde næsten slette alt, da du har 4 i php teknologien, og derfor kender til næsten alt inden for det område...



Indlæg senest redigeret d. 27.03.2006 14:16 af Bruger #2796
Jeg mener faktisk at det virker fint nok det som du skriver i dit første eksempel (med myvar), men dog mener jeg at denne variabel vil blive public og ikke private!

Mht. dit sidste eksempel så ville jeg her vælge at gøre brug af __get og __set, da det er det som de er der for. Læs eventuelt min artikel om PHP5 her på udvikleren, for at se hvordan disse skal bruges.

Hvor korrekt det du gør er ved jeg ikke, men hvis det virker, så virker det vel?



User
Bruger #31 @ 27.03.06 15:09
Det er bedre skik at define vars øverst i en klasse, men som der også er blevet nævnet, så kan en var forsvinde hvis man ikke definer den før brug. :)



Det virker kaare .. jeg bruger det mange steder .. og ja den er public (det jeg spurgte om i den chan var om jeg kunne force den private)

Jeg forstår ikke helt hvad du mener med __get og __set... det har jo intet med autogenering af variabler fra udfra database struktur ?



__get og __set er jo til adgang til variable og ikke til adgang inde fra classen



Det er bedre skik at define vars øverst i en klasse, men som der også er blevet nævnet, så kan en var forsvinde hvis man ikke definer den før brug. :)


Det har jeg aldrig oplevet ... ! jeg bruger dette i ret store projekter uden problemer.

Skik mæssigt er nok mest det jeg spørger om. Mit problem er lidt at, ja - det er oop skik .. men det er jo ikke php skik :S



Indlæg senest redigeret d. 27.03.2006 15:19 af Bruger #9709

Jeg burde næsten slette alt, da du har 4 i php teknologien, og derfor kender til næsten alt inden for det område...


:P



Jeg bryder mig bestemt heller ikke om den måde du gør det på. Og jeg har aldrig set noget der kunne bruges til at gøre variabler private på den måde; skulle det være muligt, må det have karakter af at være et meget grimt hack. Umiddelbart tror jeg Jimmi er inde på det reelle problem: forkert design...

Du giver ingen argumenter for at PHP5 ikke skulle være 100% objektorienteret -- men jeg er da enig med dig. Det kan man dog også sige Java heller ikke er, i modsætning til fx Ruby - og Smalltalk, efter sigende. Gør det nogen forskel?



Jeg bryder mig bestemt heller ikke om den måde du gør det på. Og jeg har aldrig set noget der kunne bruges til at gøre variabler private på den måde; skulle det være muligt, må det have karakter af at være et meget grimt hack. Umiddelbart tror jeg Jimmi er inde på det reelle problem: forkert design...

Du giver ingen argumenter for at PHP5 ikke skulle være 100% objektorienteret -- men jeg er da enig med dig. Det kan man dog også sige Java heller ikke er, i modsætning til fx Ruby - og Smalltalk, efter sigende. Gør det nogen forskel?


Kan du gå mere i dybten om hvorfor det er forkert ? jeg forstår at det er forkert i oop, men forstår det på den anden side ikke fordi det jo netop er php.

Jeg har så at sige opgivet at få dem private, dette var mere et spørgsmål om jeg bare var en knallert eller hvad? så kunne jeg jo ændre på det, vi lærer hver dag.

Forskel ... overhovedet ikke :) jeg elsker php 5 :)



Jeg bryder mig bestemt heller ikke om den måde du gør det på. Og jeg har aldrig set noget der kunne bruges til at gøre variabler private på den måde; skulle det være muligt, må det have karakter af at være et meget grimt hack. Umiddelbart tror jeg Jimmi er inde på det reelle problem: forkert design...

Du giver ingen argumenter for at PHP5 ikke skulle være 100% objektorienteret -- men jeg er da enig med dig. Det kan man dog også sige Java heller ikke er, i modsætning til fx Ruby - og Smalltalk, efter sigende. Gør det nogen forskel?


Kan du gå mere i dybten om hvorfor det er forkert ? jeg forstår at det er forkert i oop, men forstår det på den anden side ikke fordi det jo netop er php.

Jeg har så at sige opgivet at få dem private, dette var mere et spørgsmål om jeg bare var en knallert eller hvad? så kunne jeg jo ændre på det, vi lærer hver dag.

Forskel ... overhovedet ikke :) jeg elsker php 5 :)


Det kan forklares forholdvis enkelt. Hvis jeg har et æble og giver dette til dig i din hånd, har du et æble i den ene hånd. Hvis jeg giver dig æblet, og du ikke tager imod æblet, hvem har så æblet?

Hvis vi oversætter det til programmering, så er din hånd en variabel.

dvs. at vi har to variabler, en som er tom (din hånd - $var2) og en som indeholder et "æble" som en streng (min hånd - $var1).
Dette bliver til:
[code="php"]
$var1 = "æble";
$var2 = "";

$var2 = $var1; // $var2 har nu æblet.
$var1 = ""; // bare for at vise jeg ikke har det.
[/code]

Hvis vi taget det andet eksempel, hvor jeg har æblet, og giver det til dig, hvor du så ikke tager imod det, bliver det til følgende:
[code="php"]
$var1 = "æble";
$var2 = "";

$var1 = ""; // jeg har ikke æblet mere, men giver det ikke til nogen.
[/code]

Nu er begge variabler (personers hænder) tomme.
Det er det samme som der sker i din projekt klasse.

Du bliver simpelthen nødt til at tildele dine ting til prædefineret variabler, ellers bliver de væk på et tidspunkt. Det er det samme med eksemplet jeg gav omkring lokal variabler (variabler der bliver defineret i funktioner, og bruges der). Disse kan ikke tilgåes uden for funktionen - medmindre du definere dem først.

eks.
[code="php"]
<?php

$var1;

function testFunction()
{
$var2;
$var2 = "asd";
$var1 = "tildelt i testFunction()"; // ikke smukt, men bare for at vise eksemplet.
}

echo "var1: ".$var1."<br />";
echo "var2: ".$var2."<br />";

?>
[/code]

Det som der så kommer på din skærm er følgende:

var1: tildelt i testFunction()
var2:


Det kan endda også godt være at udskrivningen af $var2 giver en fejl, men siden det er php bliver der nok bare udskrevet "ingenting". Det er også dette der er med til at give fejl når du programmere. Det er tit og ofte fordi folk glemmer at initialisere sine variabler uden for lokal funktioner, og prøver at udskrive / bruge dem uden for lokal funktionerne.

Håber det hjælper...

Måske kan det også hjælpe dig, hvis du prøver at lave dette i et andet sprog, som er lidt mere type stærkt. Dette kunne f.eks. Java, C++, Pascal osv.

Eksempel i java:
[code="Java"]
public class Tester
{
public String var1;

public void testFunction()
{
String var2;

var2 = "asd";
var1 = "tildelt i testFunction()";
}

public static void main(String[]args)
{
Tester tester = new Tester();

tester.testFunction();

System.out.println("var1: "+tester.var1+"\\n");
System.out.println("var2: "+tester.var2+"\\n");
}
}
[/code]

kompiler fejlen er følgende:


Tester.java:20: cannot find symbol
symbol : variable var2
location: class Tester
System.out.println("var2: "+tester.var2+"\\n");

              ^
1 error




Indlæg senest redigeret d. 28.03.2006 11:02 af Bruger #2796
<< < 12 > >>
t