2012-03-31 13 views
1

OK. hier ist das, was ich versuche zu tun:php oop erbauer

class Image{ 

    public $_image; 
    public $_extension; 
    public $_mime; 
    public $_size; 
    public $_location; 
    public $_description; 

    public function __construct($image, $location){ 
     $this->_image = $image; 
     $this->_location = $location; 
     $this->_extension = getExtension(); 
     $this->_mime = getMime(); 
     $this->_size = getSize(); 
    } 

    private functions fallow..... 

} 

Aber ich erhalte einen internen Server-Fehler, wenn ich versuche, es zu laufen. Wenn ich die Methodenaufrufe auskommentiere, funktioniert es. Die Frage ist also, ob ich Methoden aus dem Konstruktor aufrufen kann oder ob ich mit den Methoden etwas falsch mache.

+0

Sie sollten lernen, Ihre Fehlerprotokolle zu überprüfen. 500 Interner Serverfehler ist bedeutungslos ohne Kontext von den Protokollen, auf die Sie Zugriff haben. Überprüfen Sie Ihre PHP.ini auf den Speicherort für die Protokollierung. Oft ist die Protokollierung nicht aktiviert. Sie sollten es aktivieren. – Brad

+0

Aufruf Methoden ist in Ordnung (aber Sie könnten dies mit einem einfachen Beispiel verifiziert haben ..) –

+0

Huh ??? Was??? Ich bekomme die Frage nicht (oder prob. Fehlt jede Menge Informationen). – PeeHaa

Antwort

5

Sind Ihre Funktionen getExtension, getMime und getSize vorhanden? Sind sie Methoden in dieser Klasse? Wenn sie Methoden sind, müssen sie mit $ dieses genannt werden -> ... wie in

$this->_extension = $this->getExtension(); 

Wenn sie nicht Methoden sind, und sind Funktionen, müssen Sie die Dateien stellen Sie sicher, dass/definieren enthalten sie sind geladen, bevor Sie den Konstruktor ausführen.

+0

Sie sind Mitgliedsfunktionen. Ich habe das vergessen. Jetzt funktioniert es. Danke für all die tollen Antworten. –

0

Ja, Sie können Methoden aus dem Konstruktor aufrufen. Denken Sie daran, dass die magische Methode __construct() in PHP 5 implementiert wurde. Zuvor haben Sie eine Funktion erstellt, die mit Ihrer Klasse identisch ist und als Ihr Konstruktor fungiert. Je nach PHP-Version könnte das ein Problem sein.

Zusätzlich sind die Funktionsaufrufe, die Sie machen, sind sie in der Klasse oder extern? Wenn sie innerhalb der Klasse sind, müssen Sie sie auf diese Weise anrufen:

0

Sie haben nicht angegeben, welchen Fehler Sie deutlich ablaufen. Aber versuchen Sie Klassenmethoden auch in der Klasse aufrufen this Schlüsselwort, sonst wäre es nicht:

public function __construct($image, $location) 
{ 
    $this->_image = $image; 
    $this->_location = $location; 
    $this->_extension = $this->getExtension(); 
    $this->_mime = $this->getMime(); 
    $this->_size = $this->getSize(); 
} 

wäre eine bessere Idee, um Ihren Code zu schreiben für die Methoden, die Sie geschrieben haben. Es könnte auch etwas in ihnen falsch sein. Möglicherweise zu vergessen ein Ergebnis oder etwas zurück ...

3

Nun .this Codefragment wird wie erwartet:

class Foo 
{ 
    protected $secret = null; 
    public function __construct($data) 
    { 
     $this->secret = $this->makeSecret($data); 
    } 

    public function makeSecret($data) 
    { 
     return md5($data); 
    } 
} 

$bar = new Foo('lorem ipsum'); 

Das ist kein Problem.

Aber Sie sollten wissen, das wird als eine schlechte Praxis betrachtet - um Berechnung/Arbeit im Konstruktor zu tun. Es macht diese Klasse praktisch untestabil. Wenn Sie vor dem Freigeben des Objekts für den Rest des Codes einige Berechnungen durchführen müssen, sollten Sie stattdessen eine Factory verwenden. Etwas entlang der Linien von:

class ImageFactory 
{ 
    public function build($image, $location) 
    { 
     $instance = new Image($image, $location); 
     $instance->prepare(); 
     return $instance; 
    } 
} 

Die Klasse würde einige Änderungen benötigen:

class Image 
{ 

    protected $_image; // you were leaking abstraction 
    protected $_extension; 
    protected $_mime; 
    protected $_size; 
    protected $_location; 
    protected $_description; 

    public function __construct($image, $location) 
    { 
     $this->_image = $image; 
     $this->_location = $location; 
    } 

    public function prepare() 
    { 
     $this->_extension = $this->getExtension(); 
     $this->_mime = $this->getMime(); 
     $this->_size = $this->getSize(); 
    } 

    private functions fallow..... 

} 

Nun, wenn Sie neue Objekt erstellen müssen Sie tun:

$factory = new ImageFactory; 
$image = $factory->build($file, '/uploads/'); 

Natürlich ist die Instanz ImageFactory kann wiederverwendbar sein, und wenn alle Ihre Bilder dasselbe $location verwenden, übergeben Sie diese Variable bei der Initialisierung an factory. Und die Fabrik der Lage wäre, „sich erinnern“ und übergeben an alle Bilder, die es schafft:

$factory = new ImageFactory('/uploads/'); 
$img1 = $factory->build($file); 
$img2 = $factory->build($something_else); 

Dies ist tatsächlich, wie man mit dem Erstellen von mehreren Objekten umgehen sollte, die alle Zugang brauchen, um gleiche DB-Verbindung Instanz.