Marktplatz Downloads Tutorials Forum

Designnation bietet auch:

Tutorial hinzufügen

Beliebte Links Weitere Optionen

Tutorial suchen

Titel

Schlüsselwörter

PHP / MySQL Tutorial: autoload



Ranking: +3   Kommentare: 8   |   Bewertung: Keine Berechtigung!  

Vorwort:
Was ist die Funktion __autoload?
PHP besitzt einige magische Funktionen.
Diese Funktion ist in der Lage. Klassen einfach und bequem automatisch zu "includieren".
Wer kennt das nicht das in der index.php immer am anfang folgendes steht :

Code:




<?php

include "site/class/class.tpl.php";

include 
"site/class/class.user.php";

include 
"site/class/class.database.php";

?>





Teilweise stehen dort 10 - 20 include Befehle - wen nervt das nicht?
Dagegen gibt es aber Abhilfe ich zeige euch hier wie ihr nur mit 4-5 Zeilen jede klasse automatisch includen lässt.


Hinweis:
Dieses Tutorial ist nicht für voll Anfänger gedacht etwas php Erfahrung sollte man mitbringen.




Tutorial:
In diesem Beispiel werde ich euch das anhand von 3 php Dateien zeigen.

1. Erstellt eine index.php.
2. Erstellt eine Datei namens class.foo.php.
3. Erstellt eine Datei namens class.bar.php.

Die index.php beinhaltet diesen code:

Code:




<?php

function __autoload($class_name) {

    require_once 
'class.' $class_name '.php';

}



$objekt = new foo();

$objekt2 = new bar(); 

?>





Als nächstes erstellen wie im gleichen Ordner die Dateien class.foo.php und class.bar.php.


Inhalt von class.foo.php:

Code:




<?php

class foo {

    function 
__construct(){

        
$a 5;

        return 
$a;

    }

}

?>






Inhalt von class.bar.php:

Code:




<?php

class bar{

    function 
__construct(){

       
$a 5;

       
$b 4;

       echo (
$a $b) * $b;

    }

}

?>






Das ist auch schon alles, die klassen werden automatisch bei einer objekterstellung includiert, das erspart:

1. das ständige include.
2. ist es nicht so RAM lastig weil nur dann includiert wird wenn man es braucht.

Wichtig ist nur eins der Name der Klasse muss auch der Name der Datei seien sonst funktioniert das ganze System nicht.

Ich hoffe ich konnte euch etwas behilflich seien.

Greetz Ezrael

Veröffentlicht von: ezrael
Veröffentlicht am: 30 Oct. 2008
Bookmarks: social bookmarking yigg it Linkarena Technorati Yahoo Mr. Wrong
Schlüsserwörter: autoload include

Kommentar(e) (8)


malkusch sagt:

Auf http://php-autoloader.malkusch.de/de/ findet man eine freie Autoloader Implementierung. Er findet Klassendefinitionen automatisch, nutzt einen Index und hat keine Probleme mit anderen Autoloadern.

27 Nov. 2009 12:47:27 • Antworten


daprophet sagt:

Ich muss manuakasam recht geben. Ein Tutorial soll etwas lehren/beibringen und zwar RICHTIG! Muss auf Gefahren und weitere Möglichkeiten hinweisen. Jedoch muss ich auch bei ihm was anprangern: hmCMS_BASE_PATH wird nicht geprüft.

10 Jan. 2009 11:11:34 • Antworten


manuakasam sagt:

Ups, mein Fehler, natürlich breche ich das Script nur ab!
In __autoload() können keine Exceptions geworfen werden, daher der Scriptabbruch per die()

@ezrael
Wenn du dir meinen Kommentar durchliest wirst du merken, dass es nicht nur ein einfaches Copy und Paste meines persönlichen (mit sicherheit nicht perfekten) Scriptes ist, sondern dass ich den Sinn der Abfragen drunter ebenfalls erklärt habe.

Ein Tutorial soll nicht nur eine Einleitung sein. Siehe Wikipedia Tutor/Tutorium - du lehrst ein Thema wenn du ein Tutorial schreibst. Eine Einleitung gibt es zu jedem Thema über Google. Das Vorwort ist quasi eine Einleitung. Ein Tutorial ist jedoch eine komplexe Zusammenfassung aller Teilaspekte eines bestimmten Themas.

Mein Post ist eigentlich mehr als konstruktiv gewesen, dass du ihn so ins lächerlich destruktive ziehst und dir keine Ansatzpunkte herausnimmst, finde ich eigentlich eher schade...


PS:
Das was du machst ist prinzipiell eine ausführlichere aber schlechtere Variante eines einfachen linkpostings
php.net/autoload

Ich würdige jedes Tutorial hier, jedoch muss man Kritik einstecken können. Nimm dir zum Beispiel die ausführlichen Tutorials von "sam" (hat hier sehr viel geschrieben) - aus heutiger Sicht sind einige Dinge zwar sehr veraltet, aber die schreibweise ist sehr gut und er erklärt Dinge in einem sehr komplexen Zusammenhang so, dass selbst Einsteiger es verstehen ;)

Zuletzt bearbeitet am: 7 Nov. 2008 09:05:00

6 Nov. 2008 08:17:23 • Antworten


ezrael sagt:

Das sind eh die besten.... das Tutorial dient als Lehrgang daher der name Tutorial, es soll als Anhaltspunkt dienen und nicht meine fertigen scripte den Leuten als copy 'n' paste vorlegen... mir ist klar, dass man solche sachen mit exception abfangen muss... aber wie der name schon sagt
TUTORIAL
also hört auf eure schrott kommentare zu posten!
Und geht zurück Kühe melken

5 Nov. 2008 21:06:29 • Antworten


manuakasam sagt:

Dieses Beispiel ist leider "far from perfect". Eine __autoload() Funktionalität sollte man immer mit zusätzlichen Sicherheitsabfragen versehen.
Hier einmal ein etwas komplexeres Beispiel:

Code:


function __autoload($sClassName)
{
  if(!class_exists($sClassName, false) && !interface_exists($sClassName. false))
  {
    $sClassFile = hmCMS_BASE_PATH.'/inc/class.'.$sClassName.'.php ';
    if(!file_exists($sClassFile))
    {
      die('An excetion occured while trying to __autoload('.$sClassName.')'
         .'File '.$sClassFile.' for class '.$sClassName.' doesn't exist!');
    }
    require_once($sClassFile);
    if(!class_exists($sClassName, false) && !interface_exists($sClassName, false))
    {
      die('An excetion occured while trying to __autoload('.$sClassName.')'
         .'File '.$sClassFile.' exists but class or interface '.$sClassName.' has not been found!');
    }
  }
}


1) Es wird überprüft, ob die Class oder das Interface - welches gerade angesprochen wird - schon vorhanden ist. Wenn dies der Fall ist, muss keine weitere Aktion veranlasst werden und die Datei muss NICHT neu geladen werden.

2) Der Dateipfad zur angesprochenen Class oder Interface wird erstellt und es wird überprüft, ob diese Datei vorhanden ist. Wenn dies nicht der Fall ist, wird das Script abgebrochen und die entsprechende Fehlermeldung wird ausgegeben.

3) Ist der Dateiname vorhanden, so wird die Datei geladen. Anschließend wird überprüft, ob in sich in dieser Datei wirklich ein Interface oder eine Class befunden haben. Ist dies nämlich nicht der Fall, so wird wieder das Script abgebrochen und die Fehlermeldung ausgegeben.



Wieso das ganze?
I) Wenn eine Class oder ein Interface bereits im RAM geladen ist, so müssen wir sie nicht neu laden.

II) Wenn wir eine Datei laden ist noch lange nicht sichergestellt, dass sich in dieser auch wirklich die angeforderten Daten befinden. Ein einfacher Schreibfehler im Classname zum Beispiel wird über zusätzliches Abfragen direkt abgefangen.


Benutzt wird das ganze wie folgt:

Code:


try 
{
  $objFoo = new Foo();
  $objBar = new Bar();
} catch (Exception $objE) {
  echo($objE->getMessage());
}



PS: r
Wenn man sich schon mit PHP5 und objektorientierten Dingen befasst, dann sollte man sich auch um Namenskonventionen scheeren ;)

Zuletzt bearbeitet am: 6 Nov. 2008 08:20:06

4 Nov. 2008 08:26:24 • Antworten


deleted_1317046593 sagt:

Kannt ich noch gar nicht, gleich mal versuchen.^^

31 Oct. 2008 14:38:44 • Antworten


Maxximum sagt:

Sehr interresant, habs noch nicht getestet, werds aber tun, vielen Dank =)

31 Oct. 2008 13:56:54 • Antworten



Anfang

<<

1

>>

Ende

Kommentar eintragen


!! Jetzt kostenlos anmelden oder einloggen und mitdiskutieren!


Partner: • Designer in ActionFlash HilfeTutorials.dePixelio.deFlashstar BlogLizenzfreie Bilder