2010-08-25 1 views
1

Почему простая процедура создания экземпляра не работает? Я делаю тот же метод ко всем классам, которые я создал/создавал, но это единственный, который дает мне такую ​​ошибку.Другой «Еще один вызов функции-функции-члена() для не-объекта»

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

Вот мой код:

//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

Какая точная ошибка распечатывается? Включите имя фактического метода и строку. – BoltClock

ответ

4

Я думаю, что вы пытаетесь получить доступ к глобальной $myRegExp внутри области объекта.

Вы должны probaby добавить конструктор к вашему валидатора:

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

А затем создать экземпляр валидатора, как это: $validator = new Validate($myRegExp);

И вы должны объявить переменную-член «myRegExp» в классе Validate.


И на стороне примечания: Я думаю, вы должны переосмыслить свой дизайн. Если бы я тебя, я бы создать интерфейс:

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

Пусть ваши конкретные регулярные выражения классы реализуют этот интерфейс:

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

И построить свой класс Validate так:

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

Тогда вы находитесь на своем пути, чтобы получить более последовательный дизайн.

+0

+1: Конечно, похоже, что он пытается получить доступ к чему-то невидимому. Упс. – Powerlord

1

Я предполагаю, что это линия, дающая вам проблему?

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

используется $this->myRegExp, но тот не член класса Validate. У вас $ myRegExp объявлен как глобальная переменная.

Смежные вопросы