2009-08-24 5 views
0

Je me demandais pourquoi mon programme php ne retourne pas la valeur FAUX correcte TRUE lorsque la classe est compris ailleursComment retourner TRUE | FALSE de la classe en PHP

il va quelque chose comme ça

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; 
    } 
} 

et d'ailleurs je

include('signup.php'); 

$signup = new signup(); 

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

mais ça ne se inscription de $ == true, il devient FAUX chaque fois

+1

Je suppose que la question évidente est, ce est logique, et est-ce toujours vrai? – chsh

Répondre

24

Les constructeurs retournent toujours une nouvelle instance de la classe. Vous ne pouvez pas renvoyer un autre type de valeur d'un constructeur. Une meilleure façon de structurer votre code serait quelque chose comme:

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(); 
    } 
} 

Ensuite, lorsque vous construisez l'objet que vous pouvez faire:

include('signup.php'); 

$signup = new Signup(); 

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

A propos du commentaire "si vous utilisez PHP4": personne ne devrait utiliser PHP 4 ... Il n'est même plus maintenu, même pas pour les bogues liés à la sécurité. Si vous apprenez la POO en PHP, il faut aller avec PHP 5! (et compte tenu de l'utilisation de __construct, c'est PHP 5, après tout: le truc "public/var" n'est pas la seule chose qui a changé) –

+0

Je suis d'accord, même si hélas trop de gens sont encore bloqués sur PHP 4. Vous êtes tout à fait raison que __construct aurait dû être un givewaway. Je vais modifier en conséquence. – VoteyDisciple

+0

Comme le succès est spécifié dans la classe (comme il se doit), vous n'avez pas besoin de l'initialiser à NULL, puisqu'il s'agit de la valeur (non) par défaut. –

3

Cela ici:

$signup = new signup(); 

Vous créez une instance de la classe, via son constructeur.

Un constructeur n'est pas une fonction normale: je ne pense pas qu'il puisse réellement "retourner" quelque chose: il est juste là pour initialiser certaines données dans l'objet lors de son instanciation.

Avec cela, vous variable $signup est un objet; une instance de classe signup; ce n'est pas une autre sorte de valeur, quelle que soit l'instruction de retour que vous allez écrire dans votre constructeur.

Je cite wikipedia's Constructor page:

Un constructeur est similaire à une méthode d'instance , mais il diffère d'une méthode en ce qu'elle n'a jamais un type de retour explicite , il n'est pas hérité, et le plus souvent a différentes règles pour les modificateurs de portée.

0

Vous ne pouvez pas renvoyer de valeur à un constructeur.

Le seul but du constructeur est d'initialiser un objet. Dans votre exemple, $ inscription est votre objet, ce n'est pas une "valeur de retour" du constructeur.

0

Vous tentez d'imiter un "foncteur par défaut", une fonctionnalité qui n'est pas présente dans PHP jusqu'à 5.3, par ex. vous essayez d'évaluer un objet comme s'il s'agissait d'une fonction (comme mentionné ci-dessus, `` new '' renvoie toujours les instances d'objet). Les objets ne sont pas des fonctions, donc un foncteur par défaut est une méthode d'instance qui est automagiquement exécutée lorsque son objet est appelé en tant que fonction.

Dans les deux cas, la solution correcte est dans la meilleure réponse.

1

Par ailleurs, ne pas écrire des choses comme ça:

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

choses d'écriture comme ceci:

$this->success = $logic; 
+4

Cela dépend du type de logique $. Si c'est une chaîne de caractères et que l'on souhaite que $ success soit booléen, alors la valeur attribuée sera incorrecte. (Bien que le code indiqué dans la question génère un message "non défini" pour $ logic.) – GZipp