Avatar billede jtc Nybegynder
11. december 2011 - 23:10 Der er 34 kommentarer og
1 løsning

include class

Hej Jeg bruger joomla og prøver at inkludere en class fra en anden fil ved følgende kode

<?php

function __autoload($class_name) {
  include '/php/'. $class_name . '.php';
}

$obj  = new Electric();

echo "test";

?>

indholdet af den filen Electric.php i mappen /php/ her

<?php
class Electric 

    public $arrScore = array();

    public function getArrScore(){ 
        return $this->arrScore; 
    }
   
    function setScore($hul_score){
        $this->arrScore[] = $hul_score;
    }
}
?>

men ovenstående kode virker ikke, jeg får bare en blank side

jeg kan godt inkludere filen uden autoload men så kan jeg ikke bruge den class som den indeholder altså Electric.

Hvad gør jeg forkret
Avatar billede inteeeL Nybegynder
12. december 2011 - 08:16 #1
Altså du har to sider, en med din class og en med siden, hvor du skal bruge classen. Kan ikke se, hvad problemet er. Hvad er det, der ikke virker?

Vil den ikke udskrive "test" eller hvad?
Avatar billede tjens Nybegynder
12. december 2011 - 09:21 #2
1. Hvornår bliver __autoload('Electric')   kaldt?


2. Giver /php/ den rigtige folderrod?

Eller skulle det være f.eks.:
php/
./php/
../php/
Avatar billede jtc Nybegynder
12. december 2011 - 09:41 #3
Linien med test udskrives ikke og folder roden skulle være rigtig da jeg kan include filen hvis jeg undlader autoload
Avatar billede jtc Nybegynder
12. december 2011 - 11:20 #4
Linien hvor fejlen opstår er

$obj  = new Electric();

Hvad gør jeg forkert??
Avatar billede inteeeL Nybegynder
12. december 2011 - 11:21 #5
echo "Test";
har vel intet med classen at gøre?
Avatar billede jtc Nybegynder
12. december 2011 - 11:21 #6
det er samme linie som jeg går ud fra kalder funktionen __autoload automatisk
Avatar billede jtc Nybegynder
12. december 2011 - 11:30 #7
nej echo test har ikke noget med classen at gøre, jeg har bare brugt den til at tjekke hvornår koden fejler.
Avatar billede inteeeL Nybegynder
12. december 2011 - 11:33 #8
Lige til dit svar til tjans.
Du har jo kun lavet selve funktionen, umiddelbart bliver den ikke kaldt nogen steder. Ændre det til følgende i stedet for


<?php

function __autoload($class_name) {
  include '/php/'. $class_name . '.php';
}

__autoload( 'Electric');
$obj  = new Electric();

echo "test";

?>
Avatar billede jtc Nybegynder
12. december 2011 - 11:39 #9
det giver stadig fejl
Avatar billede inteeeL Nybegynder
12. december 2011 - 11:41 #10
Hvad er fejlen? Den viser bare ikke noget, eller hvad?
Avatar billede jtc Nybegynder
12. december 2011 - 11:42 #11
det er stadig linien

$obj  = new Electric();

der fejler
Avatar billede jtc Nybegynder
12. december 2011 - 11:43 #12
er der evt en anden måde jeg kan loade en class fra en anden til på
Avatar billede jtc Nybegynder
12. december 2011 - 11:48 #13
her kan du se fejlen

http://sebberklostergolfklub.dk/php/test.php

siden fejler
Avatar billede inteeeL Nybegynder
12. december 2011 - 11:50 #14
Du skal lige sikre dig, at filen electric.php bliver inkluderet.

Prøv i første omgang at droppe funktionen og inkluder filen direkte.


<?php

include( '/php/electric.php') // tjek om det url er korrekt

$obj  = new Electric();

echo "test";

?>


Hvis ikke ovenstående fungerer, så prøv at sætte classen ind i samme fil - på den måde er du 100 % sikker på, at det ikke er i inkluderingen, den fejler.
Avatar billede jtc Nybegynder
12. december 2011 - 11:53 #15
navnet på filen er Electric.php med stort begyndelsesbogstav

men som sagt kan jeg fint include filen jeg kan bare ikke
benytte den class som den indeholder

så den fejler ved
$obj  = new Electric();
Avatar billede hansepeter2 Nybegynder
12. december 2011 - 11:55 #16
Hvis php-version bruger du?

#8 __autoload kalder php selv, hvis man forsøger at bruge en klasse som endnu ikke er indlæst.
Avatar billede inteeeL Nybegynder
12. december 2011 - 11:56 #17
Hvad er fejlen her: http://sebberklostergolfklub.dk/php/test.php
- Den udskriver da "Test" hos mig.
Avatar billede inteeeL Nybegynder
12. december 2011 - 11:57 #18
Hansepeter2, det har du selvfølgelig ret i - det gik lige lidt for stærkt. __autoload siger lidt sig selv. :-)
12. december 2011 - 12:00 #19
Jeg googlede lidt rundt på autoload og fandt i http://forum.joomla.org/viewtopic.php?p=1043577 dette:

"It's important to remember that __autoload will only be executed when a class doesn't exist."

Eksemplet i det link har en klasse myclass.php.  Så skriver de $obj=new MyClass(), en ikke bestående klasse.  Derfor træder autoload i aktion.  Tricket i dette eksempel er, at autoload funktionen kalder strtolower($classname) således at new MyClass() resulterer i at myclass.php bliver inkluderet.  I dit tilfælde består klassen Electric.  Derfor træder autoload ikke i aktion ved $obj  = new Electric();
Avatar billede jtc Nybegynder
12. december 2011 - 12:02 #20
Det skulle være php version 5.2.16

men hvad mener hansepeter2 med at autoload kalder php selv, hvis man forsøger at bruge en klasse som endnu ikke er indlæst??

Ja hvis du ikke viser uskadelige http fejl får du ikke en fejl.
Men det er en http 500 serverfejl jeg får
Avatar billede jtc Nybegynder
12. december 2011 - 12:07 #21
Christian_Belgien

men hvordan får jeg så inkluderet classen Electric??
12. december 2011 - 12:20 #22
Du kunne jo prøve at kalde den electric.php og så i autoload kalde strtolower($class) som de gør i eksemplet.
Avatar billede jtc Nybegynder
12. december 2011 - 12:34 #23
Chrisitian_Belgien

det virker heller ikke.

Jeg forstår bare ikke hvorfor jeg ikke kan loade helt simpelt

<?php
include '/php/electric.php'

$obj  = new Electric;

echo "test";
?>
Avatar billede jtc Nybegynder
12. december 2011 - 12:40 #24
linien include virker fint men

$obj  = new Electric;

virker ikke
Avatar billede hansepeter2 Nybegynder
12. december 2011 - 17:01 #25
Så hvis du udkommenterer den linje og flytter echo "test" op i electric.php, så bliver det udskrevet (når du bruger ikke bruger __autoload)?
Avatar billede jtc Nybegynder
12. december 2011 - 18:46 #26
ja lige præcis hanspeter2, jeg forstår simpelthen ikke hvor den godt kan læse filen electric men jeg kan ikke bruge den class som den indeholder
12. december 2011 - 22:49 #27
Min teori (som kan være forkert) er, at dit program IKKE læser filen /php/electric.php. 

Jeg foretog følgende test:  Jeg lavede en fil jtc.php således:

<?php
echo "jtc <br>";
include 'jtc1.php';
$obj = new Electric();
echo "test";
?>

og en fil jtc1.php således:

<?php
echo "jtc1 <br>";
class Electricc
{
    public $arrScore = array();
}
?>

Når jeg så kører jtc.php får jeg dette output:

jtc
jtc1
test

Altså programmet læser jtc1.php, laver  new Electric(, og fortsætter med at outputte test.

Hvis jeg i jtc1.php ændrer klassens navn til Electric1, så giver programmet dette output:

jtc
jtc1

Altså læser programmet jtc1, men fordi den kalder en ikke (længere) bestående klasse, så afbrydes programmet, så test ikke udskrives.

Hvis jeg ændrer jtc.php til at include jtc2.php i stedet for jtc1.php og samtidig fjerner $obj = new Electric();, så får jeg dette output:

jtc
test

Programmet læser ikke (længere) siden jtc1. Derfor kommer outputtet jtc1 ikke med.  Men det forstyrrer ikke i sig selv programmets videre forløb, derfor kommer outputtet test med.  (Havde det været require 'jtc2.php' ville test ikke blive udskrevet.)

Hvis jeg til slut lader jtc include jtc2.php og $obj=new Electric(), så bliver outputtet

jtc

Programmet kalder en klasse der ikke består i jtc2.php (fordi jtc2 ikke består).  Derfor afbrydes programmet, således at test ikke udskrives.

MIN konklusion er, at dit program ikke udskriver 'test' fordi programmet afbrydes af kald til en ikke bestående klasse, eller rettere en klasse i en ikke bestående fil.

DIN reaktion vil muligvis være, at det har jeg ikke en stand forskid på, fordi dit program helt sikkert læser filen /php/electric.php.  Jeg foreslår, at du beviser dette overfor mig og dig selv ved i filen /php/electric.php at inkludere en echo, såsom:

<?php
echo "DET HAR MANDEN IKKE EN STAND FORSKID PÅ! <br>";
class Electric
{
    public $arrScore = array();
    o.s.v.
}
?>

Hvis du så får udskrevet dette echo, så har jeg uret.  Men det er også et resultat, fordi vi så ved, at vi skal finde problemet et andet sted.  Hvis du ikke får udskrevet echoet, så er problemet, hvordan det så end kan gå til, at filen /php/electric.php ikke findes!  (I så fald er det nok stien der skal kikkes på en gang mere.)
Avatar billede jtc Nybegynder
13. december 2011 - 01:34 #28
Hej Christian_Belgien

Jeg værdsætter meget du har gjort meget ud af at hjælpe mig med mit problem, og håber du vil fortsætte.

men med følgende kode får jeg en intern http 500 serverfejl, hvis ikke jeg fjerner nedenstående linie fra test.php:
$obj  = new Electric;

Altså hvis jeg fjerner ovenstående linie får jeg en side med teksten:
external class
men hvis jeg beholder linien får jeg en intern http 500 serverfejl

Filen test.php
<?php
include 'http://www.sebberklostergolfklub.dk/php/electric.php';
$obj  = new Electric;
?>

Filen electric.php
<?php
class Electric 

    public $arrScore = array();

    public function getArrScore(){ 
        return $this->arrScore; 
    }
   
    function setScore($hul_score){
        $this->arrScore[] = $hul_score;
    }

}
echo "external class";
?>

Så jeg forstår stadig ikke hvad problemet er
13. december 2011 - 08:51 #29
Så du beviser, at electric.php bliver læst ved at indsætte echoen "external class", og du tilføjer yderligere oplysninger, at du får intern 500 serverfejl.  Det er fremskridt.  Jeg har googlet rundt og fået oplyst, at du skulle få en mere detaljeret fejlmelding hvis du, på Internet Explorer, under tools - internet options - advanced fjerner 'fluebenet' i "Show friendly HTTP error messages".  Prøv engang og se hvad der sker.

Men skønt du ikke har fået løst problemet, så er du kommet frem til en mere præcis problemformulering, nemlig at når du includer electric.php, så får du internal serverfejl når du vil generere en ny Class.  En mulighed er, at du lukker dette spørgsmål og opretter et nyt spørgsmål med titel "HTTP 500 Internal Server Error" eller lignende.  Så får du frisk opmærksomhed fra de der har erfaring med server errors (ikke mig).  Jeg vil foreslå, at du viser den kode du har i #28, at du gør opmærksom på at electric.php rent faktisk indlæses, fordi du får echoen "external class", og måske gør opmærksom på, at skønt Experten afkorter URL'en, så kalder include filen electric.php, og så naturligis giver den fulde fejlmelding du får efter at have fjernet ovenstående flueben.
Avatar billede jtc Nybegynder
13. december 2011 - 13:14 #30
Endnu engang tak

Jeg har fjernet fluebenet i vis meddelser om uskadelige http fejl.
Og siden viser nu ingen intern http 500 serverfejl, men alt hvad der står efter linien hvor jeg generere en variable af den pågældende class, bliver ikke udført.

men jeg får ingen fejlmelding, koden bliver bare ikke eksekveret.

Så jeg står stadig på bar bund
13. december 2011 - 13:23 #31
Ja, jeg er også på bar bund, men jeg ser, at du har oprettet et nyt spørgsmål.  Så må vi håbe det fanger nogen der har bedre fat på de ting.

Lukker du så dette spørgsmål?  Hvis du selv opretter et svar og accepterer det undgår du at give points for indlæg der ikke løste problemet.
Avatar billede hansepeter2 Nybegynder
13. december 2011 - 14:03 #32
Efter at have set dit andet spørgsmål bliver jeg nysggerig.

Hvordan ser din linje ud med include (uden autoload)? Jeg tænker på, om du har sat http:// på den også :)
Avatar billede jtc Nybegynder
13. december 2011 - 14:41 #33
Ja nu har jeg fundet løsningen på spørgsmålet med hjælp fra hanspeter2 her
http://www.eksperten.dk/spm/953184#reply_7878706
Hans peter får point på dette link, men jeg her giver Christian_Belgien point for at indsnævre problemet.

I skal alle have tak for hjælpen
Avatar billede hansepeter2 Nybegynder
13. december 2011 - 14:51 #34
Så konklusionen må være: /php/ peger på et andet bibliotek, end du tror :)
Avatar billede jtc Nybegynder
13. december 2011 - 16:17 #35
Ja jeg troede /php/electric.php var nok til at refere til roden af hjemmesiden, men det var det så ikke :-(

løsningen var:

include $_SERVER['DOCUMENT_ROOT'].'/php/electric.php';

så endnu engang tak
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