2010-08-25 5 views
1

Pourquoi une simple instanciation ne fonctionne pas? J'ai fait la même méthode à toutes les classes que j'ai créées/instanciées mais c'est la seule qui me donne ce genre d'erreur.Autre "Encore un autre appel à une fonction membre() sur un non-objet"

Fatal error: Call to a member function validate_fname_and_lname() on a non-object in /homepages/......../Validate.php on line 23 

Voici mon code:

//Class Validate 
<?php 

require_once 'RegExp.php'; 

$myRegExp = new RegExp(); 

class Validate 
{ 
    //Sends each entry to corresponding RegExp function with appropriate regular expression 
    function validate_form($un, $fname) 
    { 
     $err_counter = 0; 

     if(!$this->myRegExp->validate_fname_and_lname($fname)) 
     { 
      $error_identifier .= 'firstName+'; 
      ++$err_counter; 
     } 
    } 
} 


//Class RegExp 
<?php 

class RegExp 
{ 
    function validate_fname_and_lname($flname) 
    { 
     return preg_match("/[a-zA-Z' ']{2,}/", $flname); 
    } 
} 
+0

Quelle est l'erreur exacte en cours d'impression? Incluez le nom de la méthode actuelle et la ligne. – BoltClock

Répondre

4

Je pense que vous essayez d'accéder au $myRegExp global à partir de la portée de l'objet.

Vous devez probaby ajouter un constructeur à votre validateur:

public function __construct($re) 
{ 
    $this->myRegExp = $re; 
} 

Et puis instancier votre Validator comme ceci: $validator = new Validate($myRegExp);

Et vous devez déclarer une variable membre 'myRegExp' dans votre classe Valider.


Et sur une note de côté: Je pense que vous devriez repenser votre conception. Si je vous, je créerais une interface:

interface IValidator 
{ 
    public function valid($input); 
} 

Laissez vos classes regex spécifiques à mettre en œuvre cette interface:

class ValidateFnameAndLname implements IValidator 
{ 
    function valid($flname) 
    { 
     return preg_match("/[a-zA-Z' ']{2,}/", $flname); 
    } 
} 

Et construire votre classe Valider comme ceci:

class Validate 
{ 
    protected $myRegExp; 
    public function __construct(IValidator $validator) 
    { 
     $this->myRegExp = $validator; 
    } 
    //Sends each entry to corresponding RegExp function with appropriate regular expression 
    function validate_form($un, $fname) 
    { 
     $err_counter = 0; 

     if(!$this->myRegExp->valid($fname)) 
     { 
      $error_identifier .= 'firstName+'; 
      ++$err_counter; 
     } 
    } 
} 

Ensuite, vous êtes sur la bonne voie pour obtenir un design plus cohérent.

+0

+1: On dirait qu'il tente d'accéder à quelque chose qui n'est pas visible. Oups. – Powerlord

1

Je suppose que c'est la ligne qui vous pose un problème?

if(!$this->myRegExp->validate_fname_and_lname($fname)) 

Vous utilisez $this->myRegExp, mais c'est pas membre de la classe Valider. Vous avez $ myRegExp déclaré comme variable globale.

Questions connexes