2016-06-27 2 views
0

Я все еще играю с PHP и ООП. Но не понимаю, как отменить ошибки из класса.Обработка ошибок в классе PHP

индексный файл

include 'class.php'; 
$test = new magic('', '', '33'); 
$test->getfullname(); 
foreach ($test->get_errors() as $error) { 
    echo $error . '<br>'; 
} 

класс:

class magic 
{ 

    private $name; 
    private $surname; 
    private $age; 
    private $errors = array(); 

    function __construct($name, $surname, $age) 
    { 
     $this->name = $name; 
     $this->surname = $surname; 
     $this->age = $age; 
    } 

    public function get_errors() 
    { 
     return $this->errors; 
    } 

    public function getname() 
    { 
     if (!empty($this->name)) { 
      return true; 
     } else { 

      array_push($this->errors, 'Please check name'); 
      return false; 
     } 
    } 

    public function getsurname() 
    { 
     if (!empty($this->surname)) { 
      return true; 
     } else { 

      array_push($this->errors, 'Please check surname'); 
      return false; 
     } 
    } 

    public function getfullname() 
    { 
     if (($this->getname()) && ($this->getsurname())) { 
      echo $this->name . ' ' . $this->surname; 
     } 
    } 

} 

Мой вопрос: почему, когда имя или фамилия пусто, то возвращение пожалуйста, проверьте имя или фамилию, но когда оба пусто, то возвращение только первый? Как свечать эти ошибки типа в классе PHP и что лучше всего делать? Я не думаю, что могу использовать исключения try/catch в этом сценарии.

+2

короткого замыкания оценки. если 'getName()' возвращает false, тогда PHP знает, что ваш '&&' НИКОГДА не может оценивать значение true, поэтому он не беспокоится о вызове 'getSurname', потому что его возвращаемое значение не имеет значения для определения значения' && '. –

+0

@MarcB, но в целом это в значительной степени верно? –

+0

http://php.net/manual/en/language.operators.logical.php. обратите внимание на первые 4 строки кода в примерах. –

ответ

2

Я предлагаю обработку ошибок в конструкторе и бросать исключение.

class magic 
{ 

    /** 
    * @param string $name 
    * @param string $surname 
    * @param int $age 
    * @throws Exception 
    */ 
    public function __construct($name, $surname, $age) 
    { 
     $errors = []; 

     if (empty($name)) { 
      $errors[] = 'Name is required.'; 
     } 

     if (empty($surname)) { 
      $errors[] = 'Surname is required.'; 
     } 

     if (!empty($errors)) { 
      throw new Exception(implode('<br />', $errors)); 
     } 

     $this->name = $name; 
     $this->surname = $surname; 
     $this->age = $age; 
    } 

    public function printFullname() 
    { 
     echo $this->name . ' ' . $this->surname; 
    } 

} 

клиент:

include 'class.php'; 

try { 
    $test = new magic('', '', '33'); 
    $test->printFullname(); 
} catch (Exception $exc) { 
    echo $exc->getMessage(); //error messages 
} 
-1

Нет причин, по которым вы не можете использовать исключения в этом сценарии, это то, для чего они предназначены, гораздо более изящные, чем этот вид $this->geterrors();.

http://php.net/manual/en/language.exceptions.php

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