[OOP] Objekt initialisieren ohne Konstruktor aufzurufen

an Yaslaw: Wie schon gesagt, ist es nicht möglich in PHP einer Methode den Namen new zu geben, da new ein Sprachkonstrukt ist.

an Saftmeister: Richtig, dass ist das MVC-Pattern, wie es in vielen Fällen genutzt wird. Mir ist dies aber hauptsächlich von Ruby on Rails bekannt. Die Idee, dass man eine Methode namens init dafür nutzt, gefällt mir schon eher, aber es muss doch eine Möglichkeit geben das mit der Methode __construct zu lösen.
 
obs den Namen new() oder init() oder getNew() oder heyPennerHierHastNeNeuInstanz() heisst ist eigentlich egal.
Das Konzept von __construct ist nun mal, dass es am Anfang ausgeführt wird. Wenn du das nicht willst, dann musst du auf __construct verzichten.
Mir ist auf alle Fälle keine Lösung bekannt um ein bestehendes __construct zu umgehen, ausser du machst eine Ableitung und mit eigenem __construct(), welcher den __construct() des Parents nicht aufruft.

PHP:
<?php
class ClassNew{
    protected $id;
    public function __construct(){
        echo "construct vom ClassNew";
        $this->id = -1;
    }
    public function getId(){
        return $this->id;
    }
}

class ClassEdit extends ClassNew{
    public function __construct($id){
        echo "construct vom ClassEdit";
        $this->id = $id;
    }   
}

$newObj = new ClassNew();
echo '<br />';
print_r($newObj->getId());
echo '<hr />';
$editObj = new ClassEdit(42);
echo '<br />';
print_r($editObj->getId());
?>

ergibt
Code:
construct vom ClassNew
-1
construct vom ClassEdit
42
 
Mh mh mh, das klingt doch nach einer Lösung, die mir gefallen würde. Daran habe ich noch gar nicht gedacht, aber das klingt wirklich gut. Aber generell wäre es auch interessant gewesen, wenn es direkt eine Möglichkeit gäbe den Konstruktor zu umgehen.
 
Ich bin verwirrt :D

Was spricht gegen die Weiche die yaslaw ein paar Posts vorher vorgeschlagen hat?
edit (etwas ungenau formuliert):
Warum brauchst du unbedingt einen Konstruktor zum erstellen eines neuen Blog, warum keine Methode die das tut ?^^
 
Zuletzt bearbeitet:
Ich mag keine statischen Methoden verwenden, dass ist alles. Außerdem mag ich die vorhandenen Methoden von PHP soweit so verwenden, wie sie gedacht sind. Das heißt, dass ein Aufruf der Unterseite new über den Konstruktor definiert wird.
 
Der Kontruktor ist dazu da um Vorbereitungen für das benutzen des Objekts zu treffen.
Ich versteh das so das du den Konstruktor wie eine Methode benutzen möchtest.

Oder, wie gesagt ich bin jetzt völlig verwirrt xDDD

edit:

PHP:
class Blog
{
	public function __construct()
	{
		// Vorbereitung
	}
	
	public function _New()
	{
		// Neuen Blog erstellen
	}
	
	public function _Edit($id)
	{
		// Bestehenden Blog editieren		
	}
}
 
Zuletzt bearbeitet:
Naja, ich will eben den Konstruktor übergehen und ihn dann wahlweise ausführen. Das ist aber so ähnlich möglich, wenn ich einfach den Konstruktor überschreibe.

=== EDIT ===
Ich habe jetzt erstmal eine Möglichkeit ausgearbeitet, die schon in etwa in dorthin geht, wo ich mal sein will:
action_controller.php
PHP:
abstract class ActionController
{
}
blog.php
PHP:
class Blog extends ActionController
{
	function __construct()
	{
		echo 'Neue Seite erstellt!';
	}
	
	function edit($parameters)
	{
		echo 'Bearbeite Seite ' . $parameters[0] . '!';
	}
}
controller.php
PHP:
require_once 'action_controller.php';
require_once 'blog.php';

$query = $_SERVER['QUERY_STRING'];

if(strstr($query, '.') === false) {
	$type = 'html';
	$path = $query;
} else {
	list($path, $type) = explode('.', $query, 2);
}

list($controller, $method, $parameters) = explode('/', $path, 3);
if($parameters === null) {
	$parameters = array();
} else {
	$parameters = array_filter(explode('/', $parameters));
}

if(class_exists($controller) && is_subclass_of($controller, 'ActionController')) {
	if($method === 'new') {
		eval('class __CONTROLLER__ extends ' . $controller . ' {}');
		$instance = new __CONTROLLER__;
	} elseif(method_exists($controller, $method)) {
		eval('class __CONTROLLER__ extends ' . $controller . ' { public function __construct() {}}');
		$instance = new __CONTROLLER__;
		$instance->{$method}($parameters);
	} else {
		echo '<b>Seite existiert nicht!</b>';
	}
} else {
	echo '<b>Seite existiert nicht!</b>';
}
 
Zuletzt bearbeitet:
Und wie yaslaw bereits vorgeschlagen hat gefällt dir auch nicht?

PHP:
class Blog
{
	public function __construct($x = false)
	{
		if($x !== false)
		{
			// irgendwat machen.
		}
	}
	
	public function _New()
	{
		// Neuen Blog erstellen
	}
	
	public function _Edit($id)
	{
		// Bestehenden Blog editieren		
	}
}

// ohne Konstruktor Objekt erstellen
$a = new Blog();
// mit Konstruktor Objekt erstellen
$b = new Blog(true);

So fürhst du den Konstruktor doch quasi wahlweise aus. Oo
 
an gordonk: Die Variante hat das Problem, dass eigentlich alle Variablen und Methoden, welche mit einem Unterstrich beginnen, eigentlich Methoden sind von der Sichtbarkeit private oder protected. Außerdem find ich das ziemlich hässlich. Auch wenn wir Programmierer sind, so gibt es doch einen gewissen Grad an Ästhetik, denn man einhalten will.
 
Völlig wurscht wie die Methoden heißen , was tut das jetzt zur Sache Oo
PHP:
class Blog
{
    public function __construct($x = false)
    {
        if($x !== false) // <<<<--- darum ging es mir jetzt
        {
            // irgendwat machen.
        }
    }
    
    public function ActionNew()
    {
        // Neuen Blog erstellen
    }
    
    public function ActionEdit($id)
    {
        // Bestehenden Blog editieren        
    }
}

// ohne Konstruktor Objekt erstellen
$a = new Blog();
// mit Konstruktor Objekt erstellen
$b = new Blog(true);
 
Zurück