2015-06-19 3 views
2

У меня есть быстрый вопрос, который убивает мою голову.Метод Chaining PHP

Я пытаюсь сделать Validation System формы с помощью метода Chaining в PHP

То, что я хочу сделать, это быть в состоянии назвать, например, (пожалуйста, проверьте комментарии кода):

$firstname = $OBJECT->Forms->Field("First Name", "firstname"); //This one doesn't validate, but just puts what's on firstname field on to $firstname. But this way doesn't work for me, because I have to return the object so it can be chainable and not the variable of the POST. How can I do this? 
$firstname = $OBJECT->Forms->Field("First Name", "firstname")->Validate(); //this one validates if the field is not empty and if it's empty it'll insert the first parameter ("First Name") onto an array to display the errors. 
$email = $OBJECT->Forms->Field("Email", "email")->Validate()->Email(); //This one does the same as above but validates Email and inserts the value of the email field onto $email 
but I prefer the next one... 
$email = $OBJECT->Forms->Field("Email", "email")->Validate->Email(); //I'd rather prefer this method but I don't know how to do it without using the parenthesis on the Validate method. 

я могу сделать только это работать, как этот

$firstname = $OBJECT->Forms->Field("First Name", "firstname")->Validate(); 
and 
    $firstname = $OBJECT->Forms->Field("First Name", "firstname")->Validate()->Email(); 

Без ->Validate(); я не могу заставить его работать (как это: $firstname = $OBJECT->Forms->Field("First Name", "firstname");)

Код - своего рода беспорядок для обмена. Но код прост ... У меня есть form.class.php и validate.class.php. Form.class.php создает экземпляр класса Validate из validate.class.php, а объект Forms передается через класс Validate в конструкторе.

Я хочу быть в состоянии сделать:

$OBJECT->Forms->Field(); 
$OBJECT->Forms->Field()->Validate(); 
$OBJECT->Forms->Field()->Validate()->Email; 
$OBJECT->Forms->Field()->Validate()->Telephone; 

или это preferebly:

$OBJECT->Forms->Field(); 
$OBJECT->Forms->Field()->Validate; 
$OBJECT->Forms->Field()->Validate->Email; 
$OBJECT->Forms->Field()->Validate->Telephone; 

только выяснили:

$OBJECT->Forms->Field()->Validate(); 
$OBJECT->Forms->Field()->Validate()->Email(); 
$OBJECT->Forms->Field()->Validate()->Telephone(); 

Но любая форма OK

Спасибо.

+0

Что делает ваш класс выглядит? – Rasclatt

+0

Это PHP Framework, код немного среднего размера. Но я могу опубликовать его, если вы захотите. Но мне действительно нравятся примеры того, как добиться этого. Спасибо – luffyff

ответ

1

Смотрите, если это то, что вы пытаетесь сделать:

<?php 

    class FormValidate 
     { 
      protected $args; 
      public  $valid; 

      public function Forms() 
       { 
        // Don't know what this function is supposed to do.... 
        return $this; 
       } 

      public function Validate() 
       { 
        $numargs = func_num_args(); 
        $this->args = array(); 

        if($numargs == 2) { 
          $vals  = func_get_args(); 
          $this->args[$vals[1]] = $vals[0]; 
          $this->valid   = true; 
         } 
        else 
         $this->valid = false; 

        if(isset($this->args['firstname']) && !empty($this->args['firstname'])) 
         return true; 

        return $this; 
       } 

      public function Email() 
       { 
        if(isset($this->args['email'])) { 
          if(filter_var($this->args['email'],FILTER_VALIDATE_EMAIL)) 
           return $this->valid  = $this->args['email']; 
         } 

        return $this->valid = false; 
       } 

      public function Telephone() 
       { 
        if(isset($this->args['telephone'])) { 
          if(preg_match('/^[0-9]{3}-[0-9]{3}-[0-9]{4}$/',$this->args['telephone'])) 
           return $this->valid  = $this->args['telephone']; 
         } 

        return $this->valid = false; 
       } 
     } 

     $test = new FormValidate(); 
     // These will throw a fatal error on the base Validate('First Name','firstname') 
     // if you add another method to the chain like so: ->Validate('First Name','firstname')->Email(); 
     echo $test->Forms()->Validate('123-876-0987','telephone')->Telephone(); 

?> 
+0

На самом деле, что я хочу сделать: $ phone = $ test-> Forms («444445555») -> Телефон() ;, тогда $ phone будет иметь значение 444445555, и он должен подтвердить телефон(); если -> Телефон(); нет: затем назначьте номер 444445555 на номер телефона без проверки с помощью телефона(); – luffyff

+0

Значит, вам не нужны методы 'Field' или' Validate'? – Rasclatt

+0

Ну, это будет $ test-> Forms-> Field («Имя», «Первое имя») -> Validate(); тогда как firstname в поле - это имя ввода формы. И тогда Validate() будет проверять, является ли он пустым или нет, но он должен вернуть значение ввода первого имени, а Validate() добавит к другой специальной переменной, если поле пусто. То же, что и $ test-> Forms-> Field («Телефон», «Телефон») -> ValidateTelephone() ;, он должен вернуть телефон, если он действителен или недействителен, но если он недействителен, он будет сохранен в другой переменной. – luffyff

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