Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[PHP] autoloading classes

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Ik heb eigenlijk een bijzonder korte vraag, met betrekking tot het `auto loaden` van classes in PHP 5.3.
Stel ik heb de volgende index file:
PHP:
1
2
3
4
5
6
function __autoload($className) {
    require_once($_SERVER['DOCUMENT_ROOT'] . '/classes/' .$className . '.class.php');
}

$example = new Example();
echo $example->render();


So far, so good.
Maar er is iets wat ik niet begrijp. Het volgende; de inhoud van de Example class:
PHP:
1
2
3
4
5
6
7
class Example
{
    public function render() {
        $car = new Car();
        return $car->getType();
    }
}

Dit levert een foutmelding op ("de class Car kan niet worden gevonden").
Hier begrijp ik niet goed hoe PHP handelt. Ik heb de autoload functie immers gedefinieerd.
Is dit omdat de class Example een eigen scope heeft? En dat de autoload functie binnen die scope dus niet gedefinieerd is?

Ik kan de autoload functie uiteraard declareren in een apart bestand, en dat bestand vervolgens includen in zowel de index file, als in alle class files - maar imo verdwijnt de handigheid van het autoloaden dan een beetje.

Is het mogelijk om de autoload functie op slechts een plaats te definieren?
Wellicht zie ik iets over het hoofd.
Dank voor een korte reactie :)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Debuggen! (Debuggen: Hoe doe ik dat?) Zet gewoon eens een echo in _autoload wat 'ie zou gaan laden (wil gaan laden). Geheid een lower/uppercase probleem ofzo. Zet er eventueel een file_exist in.

PHP:
1
2
3
4
5
6
7
8
<?php 
function __autoload($className) { 
    $filetoload = $_SERVER['DOCUMENT_ROOT'] . '/classes/' .$className . '.class.php';
    echo 'About to load: ' . $filetoload . '<br>';
    echo 'Exists: ' . file_exists($filetoload) . '<br>';

    require_once($filetoload); 
}

[ Voor 59% gewijzigd door RobIII op 29-09-2011 10:32 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
RobIII schreef op donderdag 29 september 2011 @ 10:30:
Debuggen! (Debuggen: Hoe doe ik dat?) Zet gewoon eens een echo in _autoload wat 'ie zou gaan laden (wil gaan laden). Geheid een lower/uppercase probleem ofzo. Zet er eventueel een file_exist in.
Dank voor je antwoord. Het zou dus moeten werken? Ik hoef de autoload functie niet in iedere class opnieuw te definieren?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op donderdag 29 september 2011 @ 10:33:
[...]


Dank voor je antwoord. Het zou dus moeten werken? Ik hoef de autoload functie niet in iedere class opnieuw te definieren?
Die vraag kun je prima zelf beantwoorden.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • CyberKieken
  • Registratie: November 2006
  • Laatst online: 08-05-2024
Als je nu eerst eens test zoals RobIII voorstelt, zal je zelf zien wat er mis is.
Ik gok dat je zal zien dat hij vanuit Example.php de Document-root gaat nemen (die is al in classes/) en daar dan nog eens classes/ zal achter hangen, zodat je op dit pad zit te zoeken: [document-root v index]/classes/classes/Car.class.php

  • BCage
  • Registratie: Juni 2008
  • Laatst online: 25-11 17:18
DOCUMENT_ROOT is als het goed is overal hetzelfde, daar zal het niet aan liggen. Heb je er wel op gelet, dat je elke klasse in een apart bestand zet wat de naam van de klasse heeft. In jouw geval moet de klasse Car dus in het bestand Car.class.php staan.

  • CyberKieken
  • Registratie: November 2006
  • Laatst online: 08-05-2024
BCage schreef op donderdag 29 september 2011 @ 13:34:
DOCUMENT_ROOT is als het goed is overal hetzelfde, daar zal het niet aan liggen. Heb je er wel op gelet, dat je elke klasse in een apart bestand zet wat de naam van de klasse heeft. In jouw geval moet de klasse Car dus in het bestand Car.class.php staan.
juist, ik was even in de war met de __DIR__ constante, duidelijk te lang geleden dat ik nog ge-PHP't heb
Pagina: 1