[OOP] Objekt initialisieren ohne Konstruktor aufzurufen

Parantatatam

mag Cookies & Kekse
Hallo Tutorianer,

ich bin gerade dabei mir ein Framework ähnlich Ruby on Rails zu schreiben. Dabei hat man die Möglichkeit auch eine Methode new aufzurufen. Da ihr aber alle wisst, dass dies in PHP ein Sprachkonstrukt ist und somit nicht der Name einer Methode sein darf, wollte ich deren Funktionalität auf den Konstruktor auslagern. Wenn ich nun aber eine andere Methode als new, also __construct, aufrufen will, muss ich zwangsläufig den Konstruktor ausführen und im Nachhinein erst die eigentliche Methode. Deshalb suche ich meine Möglichkeit um ein Objekt zu initialisieren ohne den Konstruktor auszuführen. Weiß jemand, wie man das lösen kann?
 
Meinst du so was?

PHP:
class test {
  public function __construct()
  {
    $this->var = 'foo';
  }

  public function bar()
  {
     echo $this->var;
  }
}
new test()->bar();

Was natürlich nicht funktioniert, aber ist das in etwa das, was dir vorschwebt? Ich hab nämlich keine exakten Vorstellungen, was du da versuchst nach zu bauen. Vor allem warum?
 
In deinem Beispiel rufst du doch den Konstruktor auf, was ich nicht will. Vermutlich geht das nur mit Reflektion, allerdings kann man mit der Klasse ReflectionObject nur Objekte initialisieren, in dem man den Konstruktor ausführt.

Was ich genau will, ist, dass ich ein Objekt erstellen kann ohne den Konstruktor aufzurufen.

Beispiel, wie die Methoden aufgerufen werden (normal):
  • __construct wird aufgerufen
    -- __construct
  • andere Methode wird aufgerufen
    -- __construct
    -- andere_methode
So sollte es aber sein:
-- andere_methode
 
Höchstens eine statische Methode.
Oder du baust in den Constructor eine Weiche.....

PHP:
class MyClass{
    public $var = 'default';
    public function __construct($init=true){
        if($init){
            //TODO: Normales Constructor-Konzept
            $this->var = 'with constructor';
        }
    }
    public static function getInstanceWithoutConstructor(){
        return new self(false);
    }

}

$obj = new MyClass();
print_r($obj->var);
$obj = MyClass::getInstanceWithoutConstructor();
print_r($obj->var);
 
Die beiden Varianten habe ich auch schon bedacht, wobei mir die Variante mit den statischen Methoden besser gefällt, aber dennoch würde ich es gerne anders haben. Das muss doch irgendwie möglich sein.
 
Warum willst du den Constructor nicht aufrufen? Das ist nun mal der Sinn der Sache bei OOP. Wenn du keinen Constructor aufrufen willst, dann lass ihn halt einfach weg. Ich sehe keinen Sinn hinter deinem Vorhaben. Jedes Objekt ruft per Definition bei seiner Erzeugung eine Funktionalität identisch eines Constructors auf. Warum sollte das auch anders sein?

Mich würde ehrlich der Use-Case interessieren, der dahinter steckt.
 
Das Multiton Pattern hilft dir auch nicht weiter oder?
http://en.wikipedia.org/wiki/Multiton_pattern#PHP

sonst gib uns doch mal ein bisschen mehr input ^^

edit:
hey sorry hast ja schon in etwa geschrieben das du dir das anders vorstellst.
Aber:
Was ich genau will, ist, dass ich ein Objekt erstellen kann ohne den Konstruktor aufzurufen.
sowas geht nach meinem Wissensstand nicht.
Was spricht gegen statische Methoden ?
 
Zuletzt bearbeitet:
Nein, das ist leider nicht das, was ich suche. Ich kann mal im Detail zeigen, was ich vor habe:
PHP:
# Seitenaufruf 1: http://localhost/blog/edit/1
# Seitenaufruf 2: http://localhost/blog/new

class Blog
{
  function __construct()
  {
    echo 'Neue Seite';
  }
  
  function edit($id)
  {
    # $id ist in Fall 1 "1"
    echo 'Die Seite ' . $id . ' wird bearbeitet!';
  }
}
Bei Beispiel 1 wird die Methode edit aufgerufen. Im Beispiel 2 die Methode __construct.
 
Mach 2 Einstige über statische Methoden und lass den __construct einfach ganz weg.

PHP:
class MyClass{
	public static function new(){
		$instance = new MyClass();
		$instance->id = 0;
		//TODO neuer Eintrag
		return $instance;
	}
	public static function edit($id){
		$instance = new MyClass();
		$instance->id = $i;
		//TODO Eintrag bearbeiten
		return $instance;
	}
}

$newObj=MyClass::new();
$editObj=MyClass::edit(42);
 
Zurück