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 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:03 af Bruger #2796
Hmm jimmy jeg forstå det nogenlunde, har dog svært ved at se hvordan min variable nogen sinde skulle forsvinde. Den findes jo sålænge der er adgang til databasen. Er der ikke adgang til databasen så vil resten af klassen ikke fungere, om variablene var sat eller ej :P

men nok om det .. tak for hjælpen under alle omstændigheder.



<< < 12 > >>
t