2013-08-19 3 views
0

Я изучаю свой путь в более продвинутом программировании с PHP.Предоставление ответной реакции на вызов «вызов неопределенного метода»?

Я видел, что вызов несуществующего метода вызывает ошибку «вызов неопределенного метода».

PHP, являющийся довольно гибким, есть метод, позволяющий перехватить эту ошибку? Если да, как это обычно делается?

Редактировать: Чтобы уточнить, я хочу на самом деле что-то сделать, когда возникает ошибка, как отправить ответ назад, а не обязательно его предотвратить. Не стоит забывать, что это относится к классу. Конечно, методы применяются только в контексте класса;)

+1

Возможно, вам стоит взглянуть на это, что также охватывает фатальные ошибки: http://stackoverflow.com/a/2146171/1125956. Вы могли бы зарегистрировать ошибку в функции выключения, а пользователь, например, перенаправлен на страницу с ошибкой. –

+0

@SteAp Это не о предотвращении, а о том, что он действительно что-то делает, когда возникает ошибка. Скажите отправить приветственное сообщение обратно вызывающему, чтобы сказать, что произошло. Может быть полезным в рамках. –

+0

@SteAp Просто быстро проскользнул по ссылке. Он начинается с 'есть ли способ, которым я могу игнорировать функции ...'. Определенно не то, что я хочу. Будем принимать во внимание ответы. –

ответ

1

Да, можно улавливать вызовы неопределенных методов классов с помощью магических методов:

Вы должны реализовать __call() и/или __callStatic() методов, here.

Предположим, у вас есть простой класс CCalculationHelper всего несколькими способами:

class CCalculationHelper { 

    static public function add($op1, $op2) { 

    assert( is_numeric($op1)); 
    assert( is_numeric($op2)); 

    return ($op1 + $op2); 

    } 

    static public function diff($op1, $op2) { 

    assert( is_numeric($op1)); 
    assert( is_numeric($op2)); 

    return ($op1 - $op2); 

    } 

} 

На более позднем этапе времени, вам необходимо усилить этот класс путем умножения или деления. Вместо использования двух явных методов, вы можете использовать магический метод, который реализует обе операции:

class CCalculationHelper { 

    /** As of PHP 5.3.0 */ 
    static public function __callStatic($calledStaticMethodName, $arguments) { 

    assert(2 == count($arguments )); 
    assert(is_numeric($arguments[ 0 ])); 
    assert(is_numeric($arguments[ 1 ])); 

    switch($calledStaticMethodName) { 

     case 'mult': 
      return $arguments[ 0 ] * $arguments[ 1 ]; 
      break; 

     case 'div': 
      return $arguments[ 0 ]/$arguments[ 1 ]; 
      break; 

    } 

    $msg = 'Sorry, static method "' . $calledStaticMethodName . '" not defined in class "' . __CLASS__ . '"'; 
    throw new Exception($msg, -1); 

    } 

    ... rest as before... 

} 

Вызова его следующим образом:

$result = CCalculationHelper::mult(12, 15); 
+0

Справа. Так можно было бы получить звонок и отправить ответ? Возможно, используя какой-то шаблон обратного вызова. –

+1

@JamesPoulson Да, это определенно возможно.Я улучшил свой ответ. – SteAp

1

Если вы имеете в виду, как перехватить несуществующий метод в пользовательский класс, вы можете сделать что-то вроде этого

<?php 
    class CustomObject { 
     public function __call($name, $arguments) { 
      echo "You are calling this function: " . 
      $name . "(" . implode(', ', $arguments) . ")"; 
     } 
    } 

    $obj = new CustomObject(); 
    $obj->HelloWorld("I love you"); 
?> 

Или, если вы хотите, чтобы перехватить все ошибки

function error_handler($errno, $errstr, $errfile, $errline) { 
    // handle error here. 
    return true; 
} 
set_error_handler("error_handler"); 
+0

Упс. Не упоминал, что я был о занятиях, поэтому благодарим за то, что вы подумали. Да, первая возможность - это то, что меня интересует. Я полагаю, что error_handler находится в том же направлении, что и перехватывание исключенных исключений? Не думайте, что я могу использовать это, как предполагалось. –

1

Видя, как вы не хотите, чтобы оправиться от этих фатальных ошибок, вы можете использовать обработчик завершения работы:

function on_shutdown() 
{ 
    if (($last_error = error_get_last()) { 
     // uh oh, an error occurred, do last minute stuff 
    } 
} 

register_shutdown_function('on_shutdown'); 

функция вызывается в конце сценария, независимо от того, произошла ли ошибка ; для определения этого делается звонок в error_get_last().

+0

Может определенно использовать это. Я понимаю, что мой вопрос может показаться туманным, чтобы объяснить, что я хочу, чтобы приложение восстановилось, если вызов проходит по методу, который не существует. Скажем, например, ситуация, когда собеседник ожидает ответа JSON. Не может быть что-то исключение, и ошибка также может повредить вещи, поэтому, в идеале, стандартизованный ответ может быть отправлен просто для того, чтобы сказать «неубедительный метод. Проверьте конфигурацию приложения». –

+1

@JamesPoulson Тогда вы можете использовать наследование и позволить родительскому классу заботиться о обработке '__call()'. –

+0

Это хорошая идея :). У вас есть стандартный метод шаблона шаблона в абстрактном классе или что-то в этом роде. Да, '__call()' похоже, подходит здесь. –