Werden Konstruktoren mit vererbt?

Klein0r

Erfahrenes Mitglied
Hallo zusammen!

Ich habe mir neulich ein Konzept für die Darstellung von Inhalt auf meiner Seite überlegt - Objektorientiert. Dabei erbt jede Klasse die etwas darstellen möchte von folgender Klasse:

PHP:
<?

abstract class IncludeModel {
	
	protected $filename;
	protected $file_parameters;
	protected $sqlconn;
	protected $user;
	protected $bbcode;
	
	public function IncludeModel($filename, $parameters, $sqlconn, $user, $bbcode) {
		$this->filename = $filename;
		$this->convert_parameters($parameters);
		$this->sqlconn = $sqlconn;
		$this->user = $user;
		$this->bbcode = $bbcode;
	}
	
	// Kann überschrieben werden
	protected function get_needed_parameters() {
		return null;
	}
	
	// Kann überschrieben werden
	protected function search_string($value) {
		return null;
	}
	
	// Kann überschrieben werden
	public function get_title_extention() {
		return null;
	}
	
	// Wandelt die Parameter die eingegeben wurden in lesbare Links
	private function convert_parameters($parameters) {
		$parameterstring = $this->get_needed_parameters();
		if ($parameterstring != null) {
			$exploded_names = explode("|", $parameterstring);
			
			for ($paramcounter=0;$paramcounter<count($parameters);$paramcounter++) {
				
				$this->file_parameters[$exploded_names[$paramcounter]] = $parameters[$paramcounter];
			}
		}
	}
	
	public abstract function show_content_of_file();
	
	// Gibt die Klasse zurück - Statisch
	public static function factory($page)
	{
		$class = 'inc_' . str_replace('/', '_', $page);
		$file = './links/' . strtolower($page) . '.php';
		
		if(!is_readable($file) || (!include_once($file))) {
			throw new Exception('Datei wurde nicht gefunden.');
		}
		
		if(!class_exists($class, false)) {
			throw new Exception('Keine Definition der Klasse '.$class);
		}
		
		if(!in_array(__CLASS__, class_parents($class, false))) {
			throw new Exception('Alle Klassen müssen müssen Kindklassen von ' . __CLASS__ . ' sein');
		}
		
		return $class;
	}
	
}

?>

Dabei übergebe ich im Konstruktor einige Werte. Nun habe ich in meiner Index.php folgenden Quellcode:

PHP:
$page = $_GET['load'];
if (!isset($page)) $page = 'news';

try {
	$class = IncludeModel::factory($page);
	$titleext = ucfirst($page);
}
catch (Exception $e) {
	$class = null;
	$errorlog = $e->getMessage();
	$titleext = 'Fehler';
}

// Falls die Klasse gefunden wurde
if ($class != null) {
	$include_page = new $class($page, $parameters, $sqlconn, $user, $bbcode);
	
	$newext = $include_page->get_title_extention();
	
	if ($newext != null) {
		$titleext .= ' ('.$newext.')';
	}
}
else {
	$include_page = null;
}

Dabei würde in der Zeile
PHP:
$include_page = new $class($page, $parameters, $sqlconn, $user, $bbcode);
doch aber eigentlich der Konstruktor der Vererbten Klasse ausgeführt, oder nicht? Soweit ich weiß werden in der Objektorientierung Konstruktoren normalerweise nicht mit vererbt. Ist das in PHP anders? Warum sollte mein Script sonst funktionieren?

Wenn ich im Konstruktor von meiner Klasse IncludeModel ein echo hinzufüge wird dieses auch ausgeführt, obwohl eigentlich eine Instanz einer ganz anderen Klasse erstellt wird...

Warum geht das Ein Gedankenfehler der trotzdem funktioniert... Ist mir gestern Abend im Bett eingefallen als ich nicht schlafen konnte ;)

lg
 
Hallo

Der Konstruktor wird nicht vererbt. Also sage ich jetzt mal aus Erfahrung. :)
Der Parent Konstruktor wird nur ausgeführt wenn du ihn aufrufst mit diesem Code:
PHP:
parent::__construct();

#EDIT

Wenn du in deiner geerbten Klasse gar keinen Konstruktor hast wird der von der oberen Klasse ausgeführt.
 
Zuletzt bearbeitet:
Irgendwie gefällt mir das noch nicht so... Warum wird automatisch der andere Konstruktor ausgeführt? Theoretisch dürfte die erbende Klasse nur einen Konstruktor ohne Parameter haben.

Das ist in anderen Sprachen doch auch nicht so... Sobald ich also einen eigenen Konstruktor in einer der Klassen definiere bekomme ich ein Problem, ja?

lg
 
Habe schon lange nicht mehr php gecodet. Aber ich glaube in php kannst du nur einen Konstruktor definieren.
Wenn du in der Child-Klasse einen (Default-)Konstruktor definierst wird nur dieser aufgerufen.
Du solltest eigentlich keine Probleme bekommen wenn du einen eigenen Konstruktor in der Child-Klasse definierst.
der Parent-Konstruktor wird dann einfach nicht ausgeführt. Du musst ihn wie oben erwähnt ausführen.
 
Ich kann dir nur sagen wie es in java t,

da kannst Du bestimmen welchen Konstruktor du aufrufen willst.

psydocode:

public class MyClass extends SomeOtherClass{
public konstuktor(){
super(obj);
}

oder
public konstruktor(){
super(); /konstruktor ohne obj übergabe
}
}



public class SomeOtherClass{

public someOtherClass{

public konstruktor(Object obj){
this.obj = obj;
}

public konstrukor(){}

}

in der someOtherClass kannst du die konstrukoren überladen. Sollte doch in php ähnlich sein.

esion
 
Danke aber ich weiß wie es in Java ist ;)
Deswegen will ich ja gerade wissen was bei PHP anders ist, denn in Java würde die obige Konstruktion von mir nicht funktionieren wenn man nicht mit super() den Konstruktor der Basisklasse aufruft...
 
Nein. Funktionen kannst du in PHP leider nicht überladen. Wäre aber schön :)

Du kannst aber einer Methode Standardwerte für die Parameter definieren.

Z.B.

function DoSomething($strTitle = ' ' )
{ ... }

diese Methode kannst du so "DoSomething()" oder mit "DoSomething('Mein Titel')" aufrufen.
 
Zuletzt bearbeitet:
Zurück