[Gelöst] Erste Gehversuche OO in PHP

Servus Forum,

wie schon der Titel verrät, sind das meine ersten Versuche OO in PHP. Also habe ich drei Fragen an euch. Muss dazu sagen, dass ich es noch nicht auf einer Umgebung ausprobiert habe.

Leider unterringelt mir mein Netbeans das Rotmarkierte:
Classname.class.php

[code]class Classname {
/*

  • Meine erste Frage:
  • ich will die Exceptions nicht in der Funktion behandeln, also folgendermaßen
  • die Exception will ich erst in der Methode, Funktion oder Script - wie man es nenne will -
  • behandeln, wo sie aufgerufen wird
    */

/*
*@throws Exception
*/
public function __construct() throws Exception {
throws new Exception(“Ich bin eine Exception”);
}

/*

  • Meine zweite Frage:
  • seit wann funktioniert der folgende Konstruktor
    */
    public function Classname() {
    }
    }[/code]

Und meine dritte Frage. Läd die __autoload() Funktion auch die Klassen, die mittels extends und implements geladen werden müssen, denn in der Api steht, dass nur bei dem Stichwort “new” und bei in der Funktion, oder muss ich die gesondert dann vor der Klassedeklaration laden.
Da ist Java einfacher :wink:

[edit]danke an chrisb; da habe ich wohl irgendeine deutsche Webseite erwischt, die das behauptet hat… und das new ist ja “trying to use”… super, hilft mir echt weiter[/edit]

[quote=“do-it-yourself”]Leider unterringelt mir mein Netbeans das Rotmarkierte:

Wäre mir nicht bekannt, dass PHP das unterstützt.

Zitat Manual:

“trying to use” schließt auch die Fälle mit ein.

Einen Zusammenhang mit dem Instantiieren eines Objektes mittels new, den du suggerierst, finde ich in der Erklärung im Manual überhaupt nicht erwähnt.

  public function __construct() 
  public function Classname() 
[/code]Beide sind das gleiche. Die __construct() ist seit PHP 5 neu. Classenname() ist noch die alte OO Schreibweise. Es gibt noch viele weiter möglichkeiten wie destructoren, autoload usw. Kann alles auf php.net oder in einem PHP5 Buch nachgelesen werden.

Hier ein Beispiel für __autoload()
[code]<?php
function __autoload ($class) {
	require_once('include/' . $class . '.php');
}[/code]Sobald du jetzt eine Klasse über new aufrufst geht Autoload die entsprechende Datei laden.
Beispiel:
[code]<?php
$email = new send_mail();
$validate = new validate_input();
[/code]Autoload holt sich jetzt automatisch die datei send_mail.php und validate_input.php ohne das du diese über
require oder inlude einbinden musst

Zu deiner Exception das ist auch nicht ganz richtig.
Hier ein Beispiel:
send_mail.php
[code]<?php
class send_mail{

    function __construct(){
		if (!function_exists('mail')) {
			throw new Exception('The send_mail class requires the Mail Function in >= PHP 4');
		}
    }
}[/code]
Danach nur noch
index.php
[code]<?php
function __autoload ($class) {
	require_once($class . '.php');
}

try{
	$email = new send_mail();
} catch (Exception $e) {
	echo $e;
}

Edit:
Was ich dir empfehlen kann ist das Buch PHP 5.3 + MySQL 5.1 von Addison Wesley -> addison-wesley.de/main/main. … tID=166356. Dort werden alle Neuheiten wie __construct(), __destruct(), __get(), __set(), __call(), __autoload() oder auch mysqli ausführlich und verständlich behandelt.

@ausschliessi: Deine Antwort sollte man ins Manual stellen :wink:

Meine __autoload() ist ein wenig umfangreich geworden, weil meine Klassen sehr zerstreut sind, aber switch case sollte doch selbst in PHP schnell durchlaufen werden. Ich wollte nur wissen, wann und ob sie aufgerufen wird.
Also an alle Anfänger:
Lest euch die Doku von ausschliessi durch!!!
Das mit den magic’s kenn ich. Die Exception class arbeitet bestimmt auch damit :smiley: bei getLine(void).

Dass __construct neuer ist, ist für mich Neu, aber ich wusste es ja nicht, ich dachte das nur :unamused: .

closed

Dann ist autload nicht mehr wirklich sinnvoll, inkludiere die Dateien lieber selbst :wink:

Ah entschuldige dann hab ich deine erste Frage etwas falsch gelesen :slight_smile:. Naja bin noch neu hier :p

Dann hättest du das Buch auch nicht gebraucht :wink: . Werde mal schauen was sich im Manual machen lässt :slight_smile:

Die __autoload() hat den Vorteil das die Datein erst eingebunden werden wenn auch die Klasse aufgerufen wird. Somit hat es schon seinen Sinn wenn er autoload ausbaut. Vorallem wenn seine Klassen verstreut sind somit vergisst er später auch nicht irgendwo ein include zu löschen/setzten.

Oh, eines zu setzen wird er sicher nicht vergessen :ps: