Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 提供被叫方对“a”的响应;调用未定义的方法“;错误?_Php_Class_Error Handling_Call - Fatal编程技术网

Php 提供被叫方对“a”的响应;调用未定义的方法“;错误?

Php 提供被叫方对“a”的响应;调用未定义的方法“;错误?,php,class,error-handling,call,Php,Class,Error Handling,Call,我正在学习如何使用PHP进行更高级的编程 我看到调用不存在的方法会产生“调用未定义的方法”错误 PHP非常灵活有没有一种技术可以拦截这个错误?如果是,通常是如何做到的 编辑:为了澄清,我想在错误发生时实际做一些事情,比如发回回复,但不一定要阻止它。忘了提到这是在类的上下文中。当然,方法只适用于类的上下文;) 是的,可以使用魔术方法捕获对类的未定义方法的调用: 您需要实现定义的\u call()和/或\u callStatic()方法 假设您有一个简单的类CCalculationHelper,只有

我正在学习如何使用PHP进行更高级的编程

我看到调用不存在的方法会产生“调用未定义的方法”错误

PHP非常灵活有没有一种技术可以拦截这个错误?如果是,通常是如何做到的


编辑:为了澄清,我想在错误发生时实际做一些事情,比如发回回复,但不一定要阻止它。忘了提到这是在类的上下文中。当然,方法只适用于类的上下文;)

是的,可以使用魔术方法捕获对类的未定义方法的调用:

您需要实现定义的
\u call()
和/或
\u callStatic()
方法

假设您有一个简单的类
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 );

  }

}
稍后,您需要通过乘法或除法来增强该类。与使用两个显式方法不同,您可以使用magic方法来实现这两个操作:

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

是的,可以使用魔术方法捕获对类的未定义方法的调用:

您需要实现定义的
\u call()
和/或
\u callStatic()
方法

假设您有一个简单的类
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 );

  }

}
稍后,您需要通过乘法或除法来增强该类。与使用两个显式方法不同,您可以使用magic方法来实现这两个操作:

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

如果您指的是如何在自定义类中截取不存在的方法,那么您可以这样做

<?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");
?>

如果您指的是如何在自定义类中截取不存在的方法,那么您可以这样做

<?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 on_shutdown()
{
    if (($last_error = error_get_last()) {
        // uh oh, an error occurred, do last minute stuff
    }
}

register_shutdown_function('on_shutdown');

在脚本结束时调用函数,无论是否发生错误;调用以确定该错误。

如果您不希望从这些致命错误中恢复,可以使用关机处理程序:

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

register_shutdown_function('on_shutdown');


在脚本结束时调用函数,无论是否发生错误;调用以确定该错误。

您可能希望查看此错误,它还包括致命错误:。例如,您可以在关机功能中记录错误,并将用户重定向到错误页面。@SteAp这不是为了防止,而是为了在错误发生时实际执行某些操作。比如说,给打电话的人发一条友好的信息,告诉他发生了什么。可能在框架中有用。@SteAp只是快速浏览了一下链接。它从
开始,是否有任何方法可以忽略函数…
。绝对不是我想要的。但是我会记下答案。@Jack我真的希望这个班来处理这个问题。下面给出的解释。错误是否真的会终止进程?我是通过ajax调用的,所以它只是搞乱了响应。您可能想看看这个,它还包括致命错误:。例如,您可以在关机功能中记录错误,并将用户重定向到错误页面。@SteAp这不是为了防止,而是为了在错误发生时实际执行某些操作。比如说,给打电话的人发一条友好的信息,告诉他发生了什么。可能在框架中有用。@SteAp只是快速浏览了一下链接。它从
开始,是否有任何方法可以忽略函数…
。绝对不是我想要的。但是我会记下答案。@Jack我真的希望这个班来处理这个问题。下面给出的解释。错误是否真的会终止进程?我通过ajax进行调用,所以它只是搞乱了响应。对。那么有可能接到电话并回复吗?也许使用了某种回调模式。@JamesPoulson是的,这绝对是可能的。我增强了我的答案。对。那么有可能接到电话并回复吗?也许使用了某种回调模式。@JamesPoulson是的,这绝对是可能的。我增强了我的回答。哎呀。没有提到我在上课,所以谢谢你考虑一下。是的,第一种可能是我感兴趣的东西。我想错误处理程序与拦截未捕获的异常是一样的?别以为我能用得上。哎呀。没有提到我在上课,所以谢谢你考虑一下。是的,第一种可能是我感兴趣的东西。我想错误处理程序与拦截未捕获的异常是一样的?我不认为我可以按计划使用它。我绝对可以使用它。我意识到我的问题可能看起来很模糊,所以为了解释我希望应用程序在调用不存在的方法时恢复的内容。例如,假设被调用方需要JSON响应。不可能有什么异常和错误也会把事情搞砸,因此,理想情况下,可以发送一个标准化的响应,简单地说,“不直接的方法。检查应用程序配置。”。@JamesPoulson然后您可以使用继承,让父类处理
\u call()
。这是个好主意:)。在抽象类或其他东西中有一个标准的方法作为模板模式。是的,
\uu call()
似乎确实适合这里。您肯定可以使用它。我意识到我的问题可能看起来很模糊,所以为了解释我希望应用程序在调用不存在的方法时恢复的内容。例如,假设被调用方需要JSON响应。不能有什么异常和错误也会把事情搞砸,因此,理想情况下,可以发送一个标准化的响应,简单地说,“非即时方法。检查应用程序配置。”。@JamesPoulson然后您可以使用