Avatar billede neverknow Nybegynder
22. september 2009 - 10:18 Der er 10 kommentarer

includes giver problemer når classer kaldes var forskellige dir's

Hej Eksperter,

Jeg har et problem som måske er ganske simpelt at løse, men håber i vil hjælpe!

Har et projekt der er bygget sådan her op:

/var/www/sitemappe/
- index.php
- functions
  - regnefunktion.php
- lib
  - regne.class.php
  - db.class.php
- config
  - db.cfg.php
osv...

lib indeholder alle mine classes og functions indeholder de sider som index.php inkludere alt efter hvilket menu punkt/funktion man vælger.

I index.php gør jeg sådan her:

include_once('functions/regnefunktion.php');

i regnefunktion.php gør jeg sådan her:

include_once('lib/regne.class.php');

og det virker sådan set også fint MED MINDRE! At man fx vil kalde regnefunktion.php direkte. Se så vil den korrekte sti jo ændre sig til ../lib/regne.class.php.

Det er kernen i mit problem!

Jeg kan så løse det ved at finde den absolutte path til filen i stedet, men det giver så problemer når man vil flytte sit projekt.

include_once($_SERVER['DOCUMENT_ROOT'].'/sitemappe/'.'lib/regne.class.php');

Hvis man gør sådan her så skal sitemappe jo ændres i koden hvis placeringen på projektet ændres og det er ikke ønskværdigt!

Håber nogen kan give et par fif.
Avatar billede repox Seniormester
22. september 2009 - 10:38 #1
Jeg har gjort det at jeg har lavet en overordnet configurationsfil som konsekvent inkluderes som det første i alle filer.

Min struktur kunne se således ud:
[code]
/www/
    + model
    + view
    + control
    + includes
      | - config.inc.php
      | - strings.inc.php
    | - index.php
[/code]

I min config.inc.php har jeg så en linie der ser således ud:

define("D_DIR", str_replace("/includes", "", dirname(__FILE__)));


Så ved jeg at konstanten D_DIR altid vil indeholde min www-rod.

Så ville jeg nemt kunne inkludere en fil fra roden, uanset hvor jeg er og uanset hvor jeg flytter min kode hen:

  include(D_DIR."/functions/regnefunktion.php");


Det var bare et forslag.
Avatar billede neverknow Nybegynder
22. september 2009 - 16:11 #2
Det er en fin idé. Men har du så en config.inc.php i hver eneste af dine undermapper? For det er jo ligepræcis problemet at jeg gerne vil inkludere filer fra min config mappe, i en anden under mappe.

Hvis jeg eksekvere index.php fra roden fint nok så stien altid lige til, men hvis jeg direkte eksekvere en include fra index.php som ligger i en anden mappe, ja så der problemer.

Så skal man ligge en path.cfg.php i hver eneste mappe og inkludere den i alle filer hvor man så i functions beder den om at strippe /functions eller i lib stripper man /lib osv.

??
Avatar billede repox Seniormester
23. september 2009 - 00:26 #3
Nej, config.inc.php er - som nævnt i mit første indlæg - overordnet.
Det er en fil jeg kun inkluderer een gang.

Du overkomplicerer en relativt simpel ting.

Idet konstanten D_DIR altid vil referere til roden, vil din fornemmeste opgave altid være at sørge for at din config.inc.php bliver inkluderet i alle filer.

Måden jeg gør det på er at jeg har en fil i min webrod kaldet cCore.php:

<?php
    require_once("includes/config.inc.php");
    require_once("includes/strings.inc.php");
    require_once("model/cFactory.obj.php");
    require_once("model/cLogger.obj.php");
   
    class cCore
    {
       
        private static $factory = null;
   
        public static function getResource( $resource )
        {
            if(!isset(self::$factory))
                self::$factory = new cFactory;
               
            return self::$factory->create( $resource );
           
        }
       
    }
   
?>


Hvis du lægger mærke til det, inkluderer jeg en fil (model/cFactory.obj.php) hvis fineste opgave er at give mig de klasser jeg beder om.

Beder jeg f.eks. om mit MySQL abstraktionslag, vil cFactory kigge efter objekter i D_DIR"./model"

Alle dine tanker om path.cfg.php og strippe stier og så videre er helt hen i vejret.
Avatar billede showsource Seniormester
23. september 2009 - 08:31 #4
Hvis du er på en apache og kan bruge .htaccess, kan du bruge:

php_admin_value include_path /harddisk-sti/til/dir/med/include-filer

i en .htaccess

Og så blot bruge include() når du skal.
Avatar billede repox Seniormester
23. september 2009 - 08:40 #5
#4
Men hvorfor? Så er du alligevel ude i at noget konsekvent skal tilrettes (her er det så bare .htaccess).
Avatar billede showsource Seniormester
23. september 2009 - 09:11 #6
Hvad der står i en .htaccess som ligger i rod af domain, vil også gælde for andre underdirs.

Hvis du kan bruge .htaccess, kan du jo også include en php file ved hver request til en php fil

php_value auto_prepend_file /harddisk-sti/til/dir/med/main_include.php
Avatar billede repox Seniormester
23. september 2009 - 10:09 #7
#6

Det ændrer ikke på det faktum at .htaccess skal tilpasses når du vil flytte/kopiere projektet over på en anden server?
Avatar billede showsource Seniormester
24. september 2009 - 08:03 #8
Det har du ret i, men personligt bruger jeg altid et dir udenfor "webscope" til include filer.
Avatar billede neverknow Nybegynder
26. september 2009 - 23:24 #9
Tror ikke helt du er med på mit problem, men har fundet en måde at gøre det på som virker i mit lille projekt.

Sætter bare en variable i hver fil så filen ved hvor den selv er henne af på serveren.

Det med at includere en config fil i hver fil er ikke en løsning. Hele problemet er jo netop, at jeg har en include som både kan kaldes via index.php men også direkte via functions/function.php. Kan være det bare er mig der slamkoder, men det virker og giver mening.

Smid et svar så kan jeg give nogen point.

Eksempel lib/regne.class.php:

$doc_root = str_replace("/lib", "", dirname(__FILE__));
include_once($doc_root."/lib/db.class.php");


eller functions/regnemaskine.php:

$doc_root = str_replace("/functions", "", dirname(__FILE__));
include_once($doc_root."/lib/regne.class.php");


Så virker det uanset om jeg kalder filen direkte eller inkludere den i en anden fil.
Avatar billede neverknow Nybegynder
26. september 2009 - 23:42 #10
Mit problem er:

/www/sitedir/
    + config
      | - db.cfg.php
    + functions
      | - regnemaskine.php
    + lib
      | - regne.class.php
    | - index.php

Index.php includere regnemaskine.php som igen kalder classen regne.class.php. Fint det virker da jeg kalder det hele fra roden vil stien til alt altid være den direkte sti. Fx her:

index.php:

include_once('functions/regnemaskine.php');

regnemaskine.php:

include_once('lib/regne.class.php');

Ovenstående virker fint, men i det øjeblik jeg vælge at eksekvere regnemaskine.php direkte så er der ballade. Så vil den rigtige sti til regne.class.php være '../lib/regne.class.php'.

Kan godt være det bare mig der vil noget der ikke er best practice.
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