2009-08-24 7 views
0

Ich habe mich gefragt, warum meine PHP-Programm nicht die richtige RICHTIG FALSCH Wert zurückgibt, wenn die Klasse anderswoWie TRUE zurück | in PHP FALSCH aus der Klasse

enthalten ist

es so etwas wie dieses

source: signup.php 

class signup 
{ 
    function buildProfile() 
    { 
     if($logic){ 
      $this->success = TRUE; 
     }else{ 
      $this->success = FALSE; 
     } 
    } 
    function __construct() 
    { 
     $this->success = NULL; 
     $this->buildProfile 
     return $this->success; 
    } 
} 

geht und an anderer Stelle habe ich

include('signup.php'); 

$signup = new signup(); 

if($signup){ 
    successFunction(); 
}else.... 

aber es ist nicht mehr als $ Anmeldungen bekommen == wahr, es ist FALSCH bekommen jedes Mal

+1

Ich denke, die offensichtliche Frage ist, was ist $ Logik, und ist es jemals wahr? – chsh

Antwort

24

Konstruktoren geben immer eine neue Instanz der Klasse zurück. Sie können keinen anderen Werttyp aus einem Konstruktor zurückgeben. Ein besserer Weg, um Ihren Code zu strukturieren wäre so etwas wie:

source: signup.php 

class Signup 
{ 
    public $success; 
    protected function buildProfile() 
    { 
     if($logic){ 
      $this->success = true; 
     }else{ 
      $this->success = false; 
     } 
    } 
    public function __construct() 
    { 
     $this->success = null; 
     $this->buildProfile(); 
    } 
} 

Dann, wenn Sie das Objekt konstruieren Sie tun können:

include('signup.php'); 

$signup = new Signup(); 

if($signup->success){ 
    successFunction(); 
}else.... 
+4

Über den Kommentar "Wenn Sie PHP4 verwenden": Niemand sollte PHP 4 verwenden ... Es ist nicht einmal mehr gepflegt, nicht einmal für sicherheitsrelevante Fehler. Wenn man OOP in PHP lernt, muss man mit PHP 5 gehen! (Und angesichts der Verwendung von __construct, es ist immerhin PHP 5: das "public/var" -Ding ist nicht das Einzige, was sich geändert hat) –

+0

Dem stimme ich zu, obwohl leider zu viele Leute immer noch auf PHP 4 stecken ganz richtig, dass __construct ein givewaway sein sollte. Ich werde entsprechend bearbeiten. – VoteyDisciple

+0

Da der Erfolg in der Klasse angegeben ist (wie es sein sollte), müssen Sie ihn nicht auf NULL initialisieren, da dies der Standardwert (nicht) ist. –

3

Damit hier:

$signup = new signup(); 

Sie erstellen eine Instanz der Klasse über ihren Konstruktor.

Ein Konstruktor ist keine normale Funktion: Ich glaube nicht, dass er irgendetwas "zurückgeben" kann: Er dient nur dazu, einige Daten im Objekt nach seiner Instanziierung zu initialisieren.

Mit dieser Variable $signup ist ein Objekt; eine Instanz der Klasse signup; Es ist keine andere Art von Wert, egal welche Anweisung Sie in Ihrem Konstruktor schreiben.

Zitiert aus wikipedia's Constructor page:

Ein Konstruktor auf eine Instanz-Methode ähnlich ist, aber es unterscheidet sich von einem Verfahren, dass es nie eine expliziten Rückgabetyp hat, wird es nicht vererbt, und in der Regel hat unterschiedliche Regeln für Bereichsmodifikatoren.

0

Sie können keinen Wert aus einem Konstruktor zurückgeben.

Der einzige Zweck eines Konstruktors besteht darin, ein Objekt zu initialisieren. In Ihrem Beispiel ist $ signup Ihr ​​Objekt, es ist kein "Rückgabewert" vom Konstruktor.

0

Sie versuchen, einen "Standard-Funktor" zu imitieren, eine Funktion, die in PHP erst ab 5.3 vorhanden ist, z. Sie versuchen, ein Objekt so zu bewerten, als ob es eine Funktion wäre (wie oben erwähnt, gibt "neu" immer die Objektinstanzen zurück). Objekte sind keine Funktionen, daher ist ein Standardfunktor eine Instanzmethode, die automatisch ausgeführt wird, wenn ihr Objekt als Funktion aufgerufen wird.

In jedem Fall ist die richtige Lösung in der oberen Antwort.

1

By the way, die Dinge nicht so schreiben:

if($logic) { 
    $this->success = true; 
}else{ 
    $this->success = false; 
} 

Schreib Dinge wie diese:

$this->success = $logic; 
+4

Das hängt davon ab, was der Typ von $ Logik ist. Wenn es sich um einen String handelt und $ success boolesch sein soll, dann wäre der zugewiesene Wert inkorrekt. (Obwohl der in der Frage angegebene Code eine "undefinierte" Nachricht für $ logic erzeugen würde.) – GZipp

Verwandte Themen