|
| Eksperimenteren med classer Fra : Jesper Lützen |
Dato : 19-02-07 08:25 |
|
Hejsa,
Jeg har gennem lang tid haft et site i drift, hvor der var indarbejdet
nogle classer, der var hugget/afskrevet direkte fra en bog. Nu er jeg
så kommet dertil, hvor jeg egentlig gerne vil forstå hvad de reelt går
ud på, og jeg er derfor begyndt at skrive min egen classe - uden alt
for meget begynderheld.
Jeg forestiller mig en class der ser således ud, hvor jeg i funktionen
find_text vil lave et opslag til min database, der skal hente noget
text ud, men uanset hvad jeg smider ind i funktionen får jeg beskeden
_Fatal error: Call to a member function find_text() on a non-object in
[første linie i funktionen find_text]_
class Language_text{
var $language_value;
function Language_text($language_value){
$this->language_value = $system_language;
}
function find_text(){
return $this->language_value;
}
}
Nu er det jo første gang jeg selv eksperimenterer med det, og når jeg
skriver noget direkte af fra bøger osv. kan jeg sagtens få det til at
fungere - men uden at forstå hvorfor. Derfor, kan en af jer forklare
mig HVORFOR jeg får fejlmeldingen, og hvad der er af krav til classen
for at undgå den?
Et af mine eksperimenter ser således ud:
function find_text(){
$req = mysql_query("SELECT language$system_language as text FROM
crew_system_languages WHERE value='menu_item_text3'");
while($res = mysql_fetch_array($req)){
extract($res);
$this->language_value = $text;
}
return $this->language_value;
}
Selve SQL'en ER testet og fungerer upåklageligt, og
databaseoplysninger defineres tidligere i filen også uden problemer.
PFT.
Venlig hilsen
Jesper Lützen
| |
Martin (19-02-2007)
| Kommentar Fra : Martin |
Dato : 19-02-07 08:52 |
|
Jesper Lützen wrote:
> Hejsa,
>
> Jeg har gennem lang tid haft et site i drift, hvor der var indarbejdet
> nogle classer, der var hugget/afskrevet direkte fra en bog. Nu er jeg
> så kommet dertil, hvor jeg egentlig gerne vil forstå hvad de reelt går
> ud på, og jeg er derfor begyndt at skrive min egen classe - uden alt
> for meget begynderheld.
>
> Jeg forestiller mig en class der ser således ud, hvor jeg i funktionen
> find_text vil lave et opslag til min database, der skal hente noget
> text ud, men uanset hvad jeg smider ind i funktionen får jeg beskeden
>
> _Fatal error: Call to a member function find_text() on a non-object in
> [første linie i funktionen find_text]_
Når man leger med klasser, så skal man altid lave en instance af klassen
i en variabel - og det gør således
$foo = new Language_text("Test");
Bemærk at "Test" er det du vil søge efter - så vidt jeg kan se...
Nu indeholder variablen $foo så en instance af klassen "Language_text"
og du kan nu begynde at kalde funktioner fra den med...
echo $foo->find_text();
>
> class Language_text{
> var $language_value;
>
> function Language_text($language_value){
> $this->language_value = $system_language;
Mon ikke $system_language skulle være $language_value ?
> }
>
> function find_text(){
> return $this->language_value;
> }
> }
Hvis du bruger PHP 5, så start gerne med at gøre det "ordentligt" - det
er lidt nemmere at lære det rigtige fra starten af.
class Language_text {
private $language_value;
public function __construct($language_value) {
$this->language_value = $language_value;
}
public function find_text() {
return $this->language_value;
}
}
Lidt til at begynde med...
private/public/protected disse betyder
private = Variabler/funktioner der KUN kan bruges i den ene klasse
protected = Variabler/funktioner der KUN kan bruges i den ene klasse, og
alle klasser der bliver kaldt sammen med den klasse
public = variabler/funktioner som kan kaldes ude for klassen, og inde i
alle klasser.
Eks 1
class A {
protected $foo;
public __construct($foo) {
$this->foo = $foo;
}
private bar() {
return "Haha!";
}
protected getFoo() {
return $this->foo;
}
}
$a = new A("Hej");
echo $a->foo; // ERROR!!! - Kan ikke kalde en protected variabel
echo $a->bar(); // ERROR!!! - Kan ikke kalde en private funktion
echo $a->getFoo(); // ERROR!!! - Kan ikke kalde en protected funktion
class B extends A {
// Da vi nu har lavet en extension til klassen A
// så er alle variabler og funktioner også inde i klassen B
// Så længe de selvfølgelig ikke er private
public $bar;
public __construct($bar) {
$this->bar = $bar;
parent::__construct($bar);
}
public getBar() {
return $this->bar;
}
}
$b = new B("Test");
echo $b->bar(); // ERROR!!! - Kan ikke kalde en private funktion
echo $b->getBar(); // Echo "Test";
Mange "nybegyndere" kan ikke altid se det geniale i et klasse opbygget
site, men det er faktisk meget genialt når man kommer godt ind i det -
men det kræver stortset ca. ½ gange så meget arbejde som hvis man bare
"hardcoded" alt - men hvis der så skal rettes i det - så kan det sagtens
tage 4 gange så KORT tid at rette diverse ting, når det er lavet på
denne måde.
Det samme, så mange klasser (hvis de ellers er godt bygget op) er 20
gange så nemme at genbruge end "hardcode".
| |
Jesper Lützen (19-02-2007)
| Kommentar Fra : Jesper Lützen |
Dato : 19-02-07 09:11 |
|
> Mange "nybegyndere" kan ikke altid se det geniale i et klasse opbygget
> site, men det er faktisk meget genialt når man kommer godt ind i det -
> men det kræver stortset ca. ½ gange så meget arbejde som hvis man bare
> "hardcoded" alt - men hvis der så skal rettes i det - så kan det sagtens
> tage 4 gange så KORT tid at rette diverse ting, når det er lavet på
> denne måde.
>
> Det samme, så mange klasser (hvis de ellers er godt bygget op) er 20
> gange så nemme at genbruge end "hardcode".
Hejsa,
Mange tak for gennemgangen - den kaster jeg mig straks spændt over.
Det er netop for at kunne genbruge og opdatere sider nemmest muligt,
at jeg vil i gang med classerne, og så måske lige så meget for at
udvide horisonten.
Jeg vender frygteligt tilbage når der opstår dybe huller igen ;)
Venlig hilsen
Jesper Lützen
| |
Martin (19-02-2007)
| Kommentar Fra : Martin |
Dato : 19-02-07 09:21 |
|
Jesper Lützen wrote:
>> Mange "nybegyndere" kan ikke altid se det geniale i et klasse opbygget
>> site, men det er faktisk meget genialt når man kommer godt ind i det -
>> men det kræver stortset ca. ½ gange så meget arbejde som hvis man bare
>> "hardcoded" alt - men hvis der så skal rettes i det - så kan det sagtens
>> tage 4 gange så KORT tid at rette diverse ting, når det er lavet på
>> denne måde.
>>
>> Det samme, så mange klasser (hvis de ellers er godt bygget op) er 20
>> gange så nemme at genbruge end "hardcode".
>
> Hejsa,
>
> Mange tak for gennemgangen - den kaster jeg mig straks spændt over.
> Det er netop for at kunne genbruge og opdatere sider nemmest muligt,
> at jeg vil i gang med classerne, og så måske lige så meget for at
> udvide horisonten.
Lidt links at læse lidt på...
http://www.spoono.com/php/tutorials/tutorial.php?id=27
Specielt for PHP 5:
http://www.phpit.net/article/php5-class-basics-part1/
>
> Jeg vender frygteligt tilbage når der opstår dybe huller igen ;)
>
> Venlig hilsen
>
>
> Jesper Lützen
>
| |
Bertel Lund Hansen (19-02-2007)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 19-02-07 09:29 |
|
Jesper Lützen skrev:
> Mange tak for gennemgangen - den kaster jeg mig straks spændt over.
Jeg ville sige at OOP ikke er velegnet til selvstudium baseret på
eksperimenter. Det er min egen erfaring. Jeg har lært mig selv en
halv snes programmeringssprog ved eksperimenter, men OOP gik jeg
totalt død på indtil jeg fik undervisning i det.
Så jeg ville anbefale en god begynderbog hvis jeg altså kendte
én. Vi brugte en opslagsbog (Java2 - the Complete Reference) og
en lærer på mit datamatikerhold.
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Martin (19-02-2007)
| Kommentar Fra : Martin |
Dato : 19-02-07 10:18 |
|
Bertel Lund Hansen wrote:
> Jesper Lützen skrev:
>
>> Mange tak for gennemgangen - den kaster jeg mig straks spændt over.
>
> Jeg ville sige at OOP ikke er velegnet til selvstudium baseret på
> eksperimenter. Det er min egen erfaring. Jeg har lært mig selv en
> halv snes programmeringssprog ved eksperimenter, men OOP gik jeg
> totalt død på indtil jeg fik undervisning i det.
OOP er svært... men når man først har de basale oplysninger i hovedet,
så er det faktisk ikke så svært at komme videre.
Det som der er svært for nogle, er hvad man skal bruge det til, og
hvordan man bruger det mest effektivt.
Det er ihvertfald min mening.
> Så jeg ville anbefale en god begynderbog hvis jeg altså kendte
> én. Vi brugte en opslagsbog (Java2 - the Complete Reference) og
> en lærer på mit datamatikerhold.
Jeg har endnu ikke brugt nogle lærebøger/opslagsbøger og jeg har da selv
lavet mit eget framework - og har rimelig styr på både interfaces og
abstrakte klasser.
Forresten et godt opslagsværk, med rigtig gode korte eksempler
http://www.phpbar.de/w/Kategorie:OOP
(Desværre kun på tysk)
| |
Rasmus (20-02-2007)
| Kommentar Fra : Rasmus |
Dato : 20-02-07 00:35 |
|
Hej Jesper Lutzen
Har lært objektorienteret i java på Århus Uni. Kan anbefale "Objects first
with java" Barnes and Kölling og "Object oriented Design & Patterns" af Cay
Horstmann. Den første er Meget begynder! og den anden har langt mere objekt
orienteret teori end den første. Der er meget af syntaksen i bøgerne der er
specifikt java orienteret, men da hovedvægten, specielt i den 2. bog helt
klart er på OOP tror jeg godt flere af kapitlerne kunne bruges til at få en
forståelse helt sprog uafhængigt.
Horstmanns bog er lige udkommet i 2. udgave der bruger en række java 5.0
features, mens den første udgave vidst bruger java 4.0 ell lign. Hvis du er
interesseret har jeg en 1. udgave til salg billigt (40 kr.)! ( I kolding
eller århus)
Som også er skrevet tror jeg det er svært at få en fornuftig forståelse for
OOP uden at læse en bog eller følge et kursus om det. Selvom OOP er bygget
så intuitivt som muligt kræver det lidt tilvending. Jeg har set alt for
mange eksempler på www.phpclasses.org og også i enkelte tutorials hvor
f.eks. featueres som inheritance bliver mere misbrugt end brugt =)
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Martin (20-02-2007)
| Kommentar Fra : Martin |
Dato : 20-02-07 11:15 |
|
Rasmus wrote:
> Som også er skrevet tror jeg det er svært at få en fornuftig forståelse for
> OOP uden at læse en bog eller følge et kursus om det. Selvom OOP er bygget
> så intuitivt som muligt kræver det lidt tilvending. Jeg har set alt for
> mange eksempler på www.phpclasses.org og også i enkelte tutorials hvor
> f.eks. featueres som inheritance bliver mere misbrugt end brugt =)
Enig - der er RIGTIG mange klasser inde på phpclasses som virkelig ikke
er særlig gode, og ligeså godt kunne have været en lille funktion, men
der er faktisk også en hel del gode indimellem som sagtens kan være af
nytte.
Fx. er jeg rimelig stor bruger af ApeForm, den gør det virkelig nemt at
opbygge HTML formularer uden at skrive en enkelt linje HTML.
| |
Jesper Lützen (19-02-2007)
| Kommentar Fra : Jesper Lützen |
Dato : 19-02-07 09:44 |
|
Martin, dit svar er rigtigt godt, men der er en enkelt ting jeg så
stadig ikke helt forstår.
Jeg skal i dit eksempel kalde variablen med følgende:
echo $foo->find_text();
formentlig fordi jeg sætter variablen med
$foo = new Language_text("test");
Nu har jeg så hele tiden været af den opfattelse at jeg kaldt
variablen med "echo $classenavn->funktionsnavn();" Er det noget jeg
har totalt misforstået og bare været heldig at det altid har passet?
Det næste er så en aktuel fejl, som med garanti skyldes at jeg ikke
forstår hvornår variablerne sættes.
Koden er pt.
class Language_text {
private $language_value;
public function __construct($language_value) {
$db_language_req = mysql_query("SELECT language$system_language as
translated_language_value
FROM crew_system_languages
WHERE value='$language_value'");
while($db_language_res = mysql_fetch_array($db_language_req)){
extract($db_language_res);
}
$this->language_value = $translated_language_value;
}
public function find_text() {
return $this->language_value;
}
}
Jeg får nu fejlen "Warning: mysql_fetch_array(): supplied argument is
not a valid MySQL result resource in (...)", som skyldes at variablen
$language_value ikke er tilgængelig når jeg kører SQL'en. Men hvordan
gør jeg den så tilgængelig?
Jeg kalder pt. funktionen med
$foo = new Language_text("menu_item_text2");
echo $foo->find_text();
Mange tak
Venlig hilsen
Jesper Lützen
| |
Martin (19-02-2007)
| Kommentar Fra : Martin |
Dato : 19-02-07 10:07 |
|
Jesper Lützen wrote:
> Martin, dit svar er rigtigt godt, men der er en enkelt ting jeg så
> stadig ikke helt forstår.
>
> Jeg skal i dit eksempel kalde variablen med følgende:
>
> echo $foo->find_text();
>
> formentlig fordi jeg sætter variablen med
>
> $foo = new Language_text("test");
>
> Nu har jeg så hele tiden været af den opfattelse at jeg kaldt
> variablen med "echo $classenavn->funktionsnavn();" Er det noget jeg
> har totalt misforstået og bare været heldig at det altid har passet?
Hvis du prøver at lave en...
echo $foo = new Klasse();
Så vil du formodentlig få en error (har jeg aldrig lige prøvet selv
faktisk, da det så ikke lige giver nogen mening :)
echo $foo->getText();
Betyder at du vil udskrive outputtet fra funktionen getText inde fra
klassen Klasse
Man skal ikke ALTID echo'e en metode
Se nedenstående..
Class Car
{
var $liter;
var $name;
var $type;
function __construct($type,$name) {
$this->name = $name;
$this->type = $type;
$this->liter = 1;
// Leje biler i vores lille klasse er altid
// næsten tomme når de udlejes derfor 1 liter
}
function Tank($liter) {
$this->liter+=$liter;
}
function getLiter() {
return $this->liter;
}
}
$toyota = new Car("Toyota","MX3");
$toyota->Tank(20);
Da Tank metoden ikke har noget output, så er behøver man selvfølgelig
ikke echo'e den.
echo $toyota->getLiter();
Her vil du få noget output... meeen man behøver ikke outputte det, du
kunne sagtens smide det ned i en variabel, et array, session osv osv.
$liter = $toyota->getLiter();
echo $liter;
$_SESSION["car"]["liter"]=$toyota->getLiter();
class Klasse
var Variabel
function Metode(Argument)
(bare lige så du ved hvad JEG kalder de forskellige ting :)
>
> Det næste er så en aktuel fejl, som med garanti skyldes at jeg ikke
> forstår hvornår variablerne sættes.
>
> Koden er pt.
> class Language_text {
> private $language_value;
>
> public function __construct($language_value) {
> $db_language_req = mysql_query("SELECT language$system_language as
> translated_language_value
> FROM crew_system_languages
> WHERE value='$language_value'");
> while($db_language_res = mysql_fetch_array($db_language_req)){
> extract($db_language_res);
> }
> $this->language_value = $translated_language_value;
> }
> public function find_text() {
> return $this->language_value;
> }
> }
>
> Jeg får nu fejlen "Warning: mysql_fetch_array(): supplied argument is
> not a valid MySQL result resource in (...)", som skyldes at variablen
> $language_value ikke er tilgængelig når jeg kører SQL'en. Men hvordan
> gør jeg den så tilgængelig?
1: language$system_language da $system_language stadig ikke sættes nogle
steder, så er det helt sikkert fordi du mangler at lave denne om :)
2: Faktisk er noget af det nemmeste er at lave en klasse til at
håndterer database opslag - Prøv at lave sådan en, så er det også meget
nemmere og hurtigere at implementerer fx. et nyt RDBMS fx. som MSSQL
eller PostgreSQL.
>
> Jeg kalder pt. funktionen med
> $foo = new Language_text("menu_item_text2");
> echo $foo->find_text();
Og din SQL kommer til at se således ud
SELECT language as translated_language_value
FROM crew_system_languages
WHERE value='$language_value'
En anden ting... i din constructor, lad for gudsskyld vær med at lave
alt for meget i denne, da det så bliver sværere og sværere at
implementere det med andre klasser.
Faktisk ville jeg lave din klasse noget ala
function __construct($lang) {
$this->lang = $lang;
}
function find_text() {
SELECT language as translated_language_value
FROM crew_system_languages
WHERE value='". $this->lang ."'
return $translated_language_value;
}
| |
Jesper Lützen (19-02-2007)
| Kommentar Fra : Jesper Lützen |
Dato : 19-02-07 09:49 |
|
On 19 Feb., 09:28, Bertel Lund Hansen <unosp...@lundhansen.dk> wrote:
> Jesper Lützen skrev:
>
> > Mange tak for gennemgangen - den kaster jeg mig straks spændt over.
>
> Jeg ville sige at OOP ikke er velegnet til selvstudium baseret på
> eksperimenter. Det er min egen erfaring. Jeg har lært mig selv en
> halv snes programmeringssprog ved eksperimenter, men OOP gik jeg
> totalt død på indtil jeg fik undervisning i det.
>
> Så jeg ville anbefale en god begynderbog hvis jeg altså kendte
> én. Vi brugte en opslagsbog (Java2 - the Complete Reference) og
> en lærer på mit datamatikerhold.
>
> --
> Bertel http://bertel.lundhansen.dk/ http://fiduso.dk/
Hej Bertel,
Jeg har også fået lidt undervisning i det på datamatikerstudie, som
jeg har kvalitetsmæssige årsager droppede igen. Jeg tror derfor jeg
har lidt af forståelsen for det, men har blot aldrig brugt det i
praksis. Skulle vi hive en bog frem ville jeg selv anbefale "C#
grundbog af Niels Hilmar Madsen & Michell Cronberg... Men der er
stadig noget vej fra den teoretiske læsning til at kunne det i
praksis ;)
Når det så er sagt, så tager jeg allligevel udfordringen op med OOP,
for lære det, det vil jeg :D
/Jesper
| |
Bertel Lund Hansen (19-02-2007)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 19-02-07 10:13 |
|
Jesper Lützen skrev:
> Jeg har også fået lidt undervisning i det på datamatikerstudie, som
> jeg har kvalitetsmæssige årsager droppede igen.
Okay, så er du jo ikke på bar bund. Og du er måske heller ikke så
forankret i sekventiel programmering som jeg er.
Hvor studerede du?
> Når det så er sagt, så tager jeg allligevel udfordringen op med OOP,
> for lære det, det vil jeg :D
Det er den første forudsætning for at det lykkes.
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Jesper Lützen (19-02-2007)
| Kommentar Fra : Jesper Lützen |
Dato : 19-02-07 10:28 |
|
> 1: language$system_language da $system_language stadig ikke sættes nogle
> steder, så er det helt sikkert fordi du mangler at lave denne om :)
Nu har jeg for overblikkets skyld ikke pastet hele koden (føj teksten
ville blive lang så ;) ). $system_languages sættes i en included fil,
som er det absolut første i min PHP-fil.
Det der driller mig er derfor ikke selve SQL'en, da jeg sagtens kan
sætte den ind som et hard-kodet opslag og få det til at virke (helt
uden at foretage ændringer i det), men jeg mangler værdien i WHERE
delen, hvor jeg jo bruger klassens værdi til at finde noget i basen.
> 2: Faktisk er noget af det nemmeste er at lave en klasse til at
> håndterer database opslag - Prøv at lave sådan en, så er det også meget
> nemmere og hurtigere at implementerer fx. et nyt RDBMS fx. som MSSQL
> eller PostgreSQL.
Netop en af de ting jeg gerne med tiden vil implementere, for det kan
jeg ABSOLUT godt se fordelen i ;)
> Og din SQL kommer til at se således ud
>
> SELECT language as translated_language_value
> FROM crew_system_languages
> WHERE value='$language_value'
$system_language er sat til "2", så SQL'en bliver
SELECT language2 as translated_language_value
FROM crew_system_languages
WHERE value='$language_value'
Hvilket giver et resultat HVIS
$language_value="menu_item_text2" (eksempelvis). Desværre ser det ud
til at SQL'en IKKE får $language_value med, så derfor må min
konklusion nødvendigvis være at jeg kører SQL'en før klassen har
forstået variablen $language_value. Giver det mening?
> En anden ting... i din constructor, lad for gudsskyld vær med at lave
> alt for meget i denne, da det så bliver sværere og sværere at
> implementere det med andre klasser.
Ok det vil jeg gøre - hvis jeg kan få det til at virke :D
| |
Martin (19-02-2007)
| Kommentar Fra : Martin |
Dato : 19-02-07 11:13 |
|
Jesper Lützen wrote:
>> 1: language$system_language da $system_language stadig ikke sættes nogle
>> steder, så er det helt sikkert fordi du mangler at lave denne om :)
>
> Nu har jeg for overblikkets skyld ikke pastet hele koden (føj teksten
> ville blive lang så ;) ). $system_languages sættes i en included fil,
> som er det absolut første i min PHP-fil.
Du kan ikke sætte en variabel udenfor klassen/funktionen - så den vil
aldrig blive sat.
Der er 3 muligheder...
1: Sætte den som en constant
define('KONSTANT','var');
define('CONST','Variabel');
class A {
$this->var;
function __construct() {
$this->var = CONST;
}
function getVar() {
return $this->var;
}
}
$a = new A();
echo $a->getVar();
2: Sætte den som en variabel
class A {
$this->var = "Variabel";
function __construct() {
}
function getVar() {
return $this->var;
}
}
$a = new A();
echo $a->getVar();
3: Gør den global inde i funktionen
$var = "Test";
class A {
$this->var;
function __construct() {
global $var;
$this->var = $var;
}
function getVar() {
return $this->var;
}
}
$a = new A();
echo $a->getVar();
Løsning #3 - ses stortset altid som dårlig programmerings teknik :)
| |
Bertel Lund Hansen (19-02-2007)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 19-02-07 12:39 |
|
Martin skrev:
> 3: Gør den global inde i funktionen
Og den pæne løsning: Overfør den som en variabel via en metode:
> class A {
> $this->var;
> function __construct() {
> }
function setVar($SomeVar) {
$this->var = $SomeVar;
}
> function getVar() {
> return $this->var;
> }
> }
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Martin (19-02-2007)
| Kommentar Fra : Martin |
Dato : 19-02-07 12:56 |
|
Bertel Lund Hansen wrote:
> Martin skrev:
>
>> 3: Gør den global inde i funktionen
>
> Og den pæne løsning: Overfør den som en variabel via en metode:
Ja det er selvfølgelig rigtigt, men det kræver så lige en ekstra linje i
sit klasse kald.
$a = new A();
$a->setVar($var);
$a->getVar();
Jeg mener bare at når det er forud defineret variabler, som ikke skal
ændres til den enkelte side - så mener jeg bestemt at define er en
ganske god metode at gøre det på.
Man kunne selvfølgelig også smide det ned i en session - meeen nu er vi
vist snart sååå langt ude at vi også kan smække det hele i en cookie :)
| |
Jesper Lützen (19-02-2007)
| Kommentar Fra : Jesper Lützen |
Dato : 19-02-07 10:32 |
|
On 19 Feb., 10:12, Bertel Lund Hansen <unosp...@lundhansen.dk> wrote:
> Jesper Lützen skrev:
>
> > Jeg har også fået lidt undervisning i det på datamatikerstudie, som
> > jeg har kvalitetsmæssige årsager droppede igen.
>
> Okay, så er du jo ikke på bar bund. Og du er måske heller ikke så
> forankret i sekventiel programmering som jeg er.
>
> Hvor studerede du?
Vejle Handelsskole på aftenstudie, men det var så ustruktureret og
uorganiseret at jeg ikke ville bruge mere tid på det. Det fik en
chance på et år, men da de stadig ikke på det tidspunkt kunne finde ud
af at planlægge mere end en undervisningsgang frem, så blev det for
meget. Forestil dig at se frem på et semester, hvor du ved at der skal
afsættes 6 lørdage, men du så sent som ultimo januar stadig ikke kan
få at vide hvornår... Det kunne livet ved siden af desværre ikke
acceptere...
> > Når det så er sagt, så tager jeg allligevel udfordringen op med OOP,
> > for lære det, det vil jeg :D
>
> Det er den første forudsætning for at det lykkes.
;)
| |
Jesper Lützen (19-02-2007)
| Kommentar Fra : Jesper Lützen |
Dato : 19-02-07 10:59 |
|
> > Og din SQL kommer til at se således ud
>
> > SELECT language as translated_language_value
> > FROM crew_system_languages
> > WHERE value='$language_value'
>
> $system_language er sat til "2", så SQL'en bliver
> SELECT language2 as translated_language_value
> FROM crew_system_languages
> WHERE value='$language_value'
>
> Hvilket giver et resultat HVIS
> $language_value="menu_item_text2" (eksempelvis). Desværre ser det ud
> til at SQL'en IKKE får $language_value med, så derfor må min
> konklusion nødvendigvis være at jeg kører SQL'en før klassen har
> forstået variablen $language_value. Giver det mening?
>
> > En anden ting... i din constructor, lad for gudsskyld vær med at lave
> > alt for meget i denne, da det så bliver sværere og sværere at
> > implementere det med andre klasser.
>
> Ok det vil jeg gøre - hvis jeg kan få det til at virke :D
ARGH jeg opdager lige at vi BEGGE har ret!
Du har altså ret i, at $system_language = null, og jeg i at på
kørselstidspunktet er $language_value = null.
Det gør så ikke situationen meget bedre, idet $system_language ER
defineret, og jeg sagtens kan kalde den fra test.php, men ikke fra
klassefilen "test_class.php", og det på trods af at variablen er sat
som det absolut første i test.php før test_class.php er included.
Dermed opstod nu ENDNU et spørgsmål - HVORFOR?
Jeg har desværre ikke mulighed for at smide filerne ud til frit skue :
(
Venlig hilsen
Jesper Lützen
| |
Martin (19-02-2007)
| Kommentar Fra : Martin |
Dato : 19-02-07 11:16 |
|
Jesper Lützen wrote:
> Det gør så ikke situationen meget bedre, idet $system_language ER
> defineret, og jeg sagtens kan kalde den fra test.php, men ikke fra
> klassefilen "test_class.php", og det på trods af at variablen er sat
> som det absolut første i test.php før test_class.php er included.
>
> Dermed opstod nu ENDNU et spørgsmål - HVORFOR?
Har du arbejdet med simple funktioner før?
For det er nemlig PRÆCIS det samme, en variabel er ALDRIG sat inde i en
funktion, man kan så gøre det på forskellige måder (se tidligere sendt
indlæg)
> Jeg har desværre ikke mulighed for at smide filerne ud til frit skue :
Du kan altid bruge < http://nopaste.php-q.net/> til at ligge source koder op.
Hvis du gerne vil beholde sourcekoderne hos din egen host, så kalder du
dem bare
test.phps (bemærk S'et, hos "normale" host, så burde dette give et flot
og syntax highlighted kode)
| |
Jesper Lützen (19-02-2007)
| Kommentar Fra : Jesper Lützen |
Dato : 19-02-07 11:17 |
|
Efter en del eksperimenter og skelen til diverse andres koder har jeg
nu fået det meste til at fungere. Der så dermed kun ét spørgsmål
tilbage:
Jeg har filen test.php, som er min hovedside. I test.php includer jeg
først en fil med settings og derefter min fil med denne klasse:
[kode start]
class Language_text {
private $language_value;
public function __construct($language_value) {
$this->language_value = $language_value;
}
public function find_text($language_value){
$db_language_req = mysql_query("SELECT language$system_language as
translated_language_value
FROM crew_system_languages
WHERE value='$language_value'");
while($db_language_res = mysql_fetch_array($db_language_req)){
extract($db_language_res);
}
$this->language_value = $translated_language_value;
return $this->language_value;
}
}
[kode slut]
I test.php giver echo "$system_language"; resultatet "2". Smider jeg
samme echo ind i min klasse-fil er variablen tom. Jeg kunne forstå
det, hvis jeg includede filerne i forkert rækkefølge, men det er ikke
tilfældet, så hvad kan allers være grund til det?
På forhånd MANGE tak!
Venlig hilsen
Jesper Lützen
Som det ses af koden skal jeg bruge variablen i min SQL.
| |
Martin (19-02-2007)
| Kommentar Fra : Martin |
Dato : 19-02-07 11:27 |
|
Jesper Lützen wrote:
> Efter en del eksperimenter og skelen til diverse andres koder har jeg
> nu fået det meste til at fungere. Der så dermed kun ét spørgsmål
> tilbage:
>
> Jeg har filen test.php, som er min hovedside. I test.php includer jeg
> først en fil med settings og derefter min fil med denne klasse:
Hvis du bruger en settings fil, med fx. database ting, eller andet der
bruges ofte.
Så kan det være en god idé at enten
1: Definer det hele i 1 array fx.
$settings = array();
$settings["database"]["user"]="brugernavn";
$settings["database"]["password"]="kode";
osv osv osv.
Så skal du kun globalisere en variabel.
2: Definer alle variabler fx.
define('DB_USER','brugernavn');
define('DB_PASS','kodeord');
osv osv osv.
| |
Jesper Lützen (19-02-2007)
| Kommentar Fra : Jesper Lützen |
Dato : 19-02-07 11:38 |
|
Så ender det skis'me med at det hele spiller... Jeg er dybt
imponeret.
Martin, tusind tak for din hjælp! Det var guld værd!
Venlig hilsen
Jesper Lützen
| |
Martin (19-02-2007)
| Kommentar Fra : Martin |
Dato : 19-02-07 12:32 |
|
Jesper Lützen wrote:
> Martin, tusind tak for din hjælp! Det var guld værd!
Bare rolig... jeg har også brugt en del år på dette efterhånden
Men det var så lidt.
| |
|
|