PHP异常处理类BADMETHODCALLEXCEPTION使用方法

 更新时间:2016年11月25日 14:56  点击:1264
异常处理我们很少接触到BADMETHODCALLEXCEPTION类了,那么这个BADMETHODCALLEXCEPTION类如何来使用?具体的步骤一聚教程小伙伴就为各位介绍一下。


BadMethodCallException是PHP标准库里的异常处理类,是PHP自带的,比如在很多框架中可以看见继承BadMethodCallException类,如Yii2中:


namespace yii\base;
 
/**
 * InvalidCallException represents an exception caused by calling a method in a wrong way.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @since 2.0
 */
class InvalidCallException extends \BadMethodCallException
{
    /**
     * @return string the user-friendly name of this exception
     */
    public function getName()
    {
        return 'Invalid Call';
    }
}

BadMethodCallException类又是继承BadFunctionCallException的:


 BadMethodCallException extends BadFunctionCallException {
/* 继承的属性 */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* 继承的方法 */
final public string Exception::getMessage ( void )
final public Exception Exception::getPrevious ( void )
final public int Exception::getCode ( void )
final public string Exception::getFile ( void )
final public int Exception::getLine ( void )
final public array Exception::getTrace ( void )
final public string Exception::getTraceAsString ( void )
public string Exception::__toString ( void )
final private void Exception::__clone ( void )
}

用法,在控制中:


public function actionResetPassword($token)
{
    try {
        $model = new ResetPasswordForm($token);
    } catch (InvalidParamException $e) {
        throw new BadRequestHttpException($e->getMessage());
    }
 
    if ($model->load(Yii::$app->request->post()) && $model->validate() && $model->resetPassword()) {
        Yii::$app->getSession()->setFlash('success', 'New password was saved.');
 
        return $this->goHome();
    }
 
    return $this->render('resetPassword', [
        'model' => $model,
    ]);
}

用于捕获异常。

当然除了上面介绍的还异常处理类Exception


1、首先php5提供了基本的异常处理类,可直接使用
 
<?php
class Exception
{
protected $message = 'Unknown exception'; // 异常信息
protected $code = 0; // 用户自定义异常代码
protected $file; // 发生异常的文件名
protected $line; // 发生异常的代码行号
function __construct($message = null, $code = 0);
final function getMessage(); // 返回异常信息
final function getCode(); // 返回异常代码
final function getFile(); // 返回发生异常的文件名
final function getLine(); // 返回发生异常的代码行号
final function getTrace(); // backtrace() 数组
final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息
/* 可重载的方法 */
function __toString(); // 可输出的字符串
}
?>

简单的使用如下:(通过异常,抛出错误信息)
 
try {
$error = 'my error!';
throw new Exception($error)
} catch (Exception $e) {
echo $e->getMessage();
}

2、我们可以扩展此类,方便我们的使用
 
class MyException extends Exception
{
// 重定义构造器使 message 变为必须被指定的属性
public function __construct($message, $code = 0) {
// 自定义的代码
// 确保所有变量都被正确赋值
parent::__construct($message, $code);
}
// 自定义字符串输出的样式
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function customFunction() {
echo "A Custom function for this type of exception\n";
}
}

异常处理的基本思想是代码在try代码被调用执行。如果try码块出现错误,我们可以执行一个抛出异常的处理。某些编程语言,如java,,在特定情况下将自动抛出异常。在php中,异常必须手动抛出。可以使用如下方式抛出一个异常:
  Throw new Exception(‘message',code);
  Throw 关键字将触发异常处理机制,它是一个语言结构,而不是一个函数,但是必须给它传递一个值。它要求一个接受对象。在最简单的情况下,可以实例化一个内置的Exception类。
  最后,在try代码之后,必须至少给出一个catch代码块。可以将多个catch代码块与一个try代码块进行关联。如果每个catch代码块可以捕获一个不同类型的异常,可以使用多个catch代码块是有意义的。例如,如果想捕获Exception类的异常,代码如下
 
Catch(Exception $e)
{
//handing exception
}
Catch代码捕获的对象就是导致异常并传递给throw语句的对象(被throw 语句抛出)。使用Exception 类的实例,是不错的选择。
Exception类提供了如下的内置方法:
  Getcode()   —返回传递给构造函数的代码。
  GetMessage() —返回传递给构造函数的消息。
  getFile()     —返回产生异常代码的文件的路径
  getLine()    —返回产生异常的代码所在的行。

注意:
当捕获到一个异常后,try()块里面的后续代码将不会继续执行,而是会尝试查找匹配的“catch”代码块
当抛出一个异常后,如果不进行catch处理,则会报“Uncaught exception 'Exception'”错误
 
<?php
function test($val){
if ($val>100){
throw new Exception("提示信息:您输入的值过大");
}
}
test(111);
?>

3.当一个异常抛出后,catch语句块可以进行处理也可以不处理
以下是我用户注册功能的部分代码
 
try{
//check forms filled in
if(!filled_out($_POST)){
throw new Exception('你还没有填写表单,请回去填写');
}
//check email address not valid
if(!check_email($email)){
throw new Exception('邮件的格式不正确');
}
//检查密度的长度是否大于6
if(strlen($passwd<6)){
throw new Exception('密度的长度应该大于6');
}
//检查两次密码是否相等
if($passwd!=$passwd1){
throw new Exception('两次密码不一样,请重新输入');
}
//检查用户名的长度是否正确
if(strlen($username)>16){
throw new Exception('用户名的长度不符,请重新输入');
}
} catch(Exception $e){
echo $e->getMessage(); //输出异常信息。
}

在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作


例子,

<?php
$data="array('key1'=>'value1','key2'=>'value2','key3'=>'value3','key4'=>'value4')";
$arr = eval("return $data;");
var_dump($arr);//array

/*
array
  'key1' => string 'value1' (length=6)
  'key2' => string 'value2' (length=6)
  'key3' => string 'value3' (length=6)
  'key4' => string 'value4' (length=6)
*/

网上很多说使用disable_functions禁止掉eval的方法都是错误的!

其实eval()是无法用php.ini中的disable_functions禁止掉的 :

because eval() is a language construct and not a function

eval是zend的,因此不是PHP_FUNCTION 函数;

那么php怎么禁止eval呢?

如果想禁掉eval可以用php的扩展 Suhosin:
安装Suhosin后在php.ini中load进来Suhosin.so,再加上suhosin.executor.disable_eval = on即可

百度搜索了一下关于PHP5.6新特性发现本站有整理过一篇相关的文章,但仔细对比了一下本文章与它有一些区别,下面我们来看看


PHP5.6起CONST新特性定义类常量可以使用常量标量表达式(Constant scalar expressions),例如:


<?php
 
class MyTimer {
    const SEC_PER_DAY = 60 * 60 * 24;
}
 
?>

define和CONST的区别是define可以用于定义全局常量,而CONST是定义类的常量。


static静态变量与define,CONST的区别是static定义的变量是可以改变的,而后两者不行,并且static静态变量是随类直接在内存中初始化,可以直接用,如$oneclass::hobby.

define可以定义数组吗?例如define(‘A_ARRAY’,array(‘o’=>’ooo’,’x’=>’xxx’)).

在PHP5.6之前是不行的,但是可以通过serialize把数组序列化,如:


# define constant, serialize array
define ("FRUITS", serialize (array ("apple", "cherry", "banana")));
 
# use it
$my_fruits = unserialize (FRUITS);

PHP5.6之后可以直接const定义一个数组:

const DEFAULT_ROLES = array('guy', 'development team');

或者:

const DEFAULT_ROLES = ['guy', 'development team'];

如果是PHP7,可以直接用define定义数组:


define('DEFAULT_ROLES', array('guy', 'development team'));

匿名函数是PHP5.3引进来了,php5.3不但引进了匿名函数还有更多更好多新的特性了,下面我们一起来了解一下PHP匿名函数与注意事项详解


PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束
PHP5.2:JSON 支持
PHP5.3:弃用的功能,匿名函数,新增魔术方法,命名空间,后期静态绑定,Heredoc 和 Nowdoc, const, 三元运算符,Phar
PHP5.4:Short Open Tag, 数组简写形式,Traits, 内置 Web 服务器,细节修改
PHP5.5:yield, list() 用于 foreach, 细节修改
PHP5.6: 常量增强,可变函数参数,命名空间增强


现在基本上都使用PHP5.3以后的版本,但是感觉普遍一个现象就是很多新特性,过了这么长时间,还没有完全普及,在项目中很少用到。

看看PHP匿名函数:

 'test' => function(){
        return 'test'
},

PHP匿名函数的定义很简单,就是给一个变量赋值,只不过这个值是个function。

以上是使用Yii框架配置components文件,加了一个test的配置。

在另一个模板页面打印试试:

 

<?= app-="">test ?>//test
OK.

什么是PHP匿名函数?

看官方解释:

匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。

匿名函数示例

<?php
echo preg_replace_callback('~-([a-z])~', function ($match) {
    return strtoupper($match[1]);
}, 'hello-world');
// 输出 helloWorld
?>

闭包函数也可以作为变量的值来使用。PHP 会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号:

匿名函数变量赋值示例


<?php
$greet = function($name)
{
    printf("Hello %s\r\n", $name);
};
 
$greet('World');
$greet('PHP');
?>
闭包可以从父作用域中继承变量。 任何此类变量都应该用 use 语言结构传递进去。

从父作用域继承变量

<?php
$message = 'hello'
 
// 没有 "use"
$example = function () {
    var_dump($message);
};
echo $example();
 
// 继承 $message
$example = function () use ($message) {
    var_dump($message);
};
echo $example();
 
// Inherited variable's value is from when the function
// is defined, not when called
$message = 'world'
echo $example();
 
// Reset message
$message = 'hello'
 
// Inherit by-reference
$example = function () use (&$message) {
    var_dump($message);
};
echo $example();
 
// The changed value in the parent scope
// is reflected inside the function call
$message = 'world'
echo $example();
 
// Closures can also accept regular arguments
$example = function ($arg) use ($message) {
    var_dump($arg . ' ' . $message);
};
$example("hello");
?>

以上例程的输出类似于:


Notice: Undefined variable: message in /example.php on line 6
NULL
string(5) "hello"
string(5) "hello"
string(5) "hello"
string(5) "world"
string(11) "hello world"


php中的匿名函数的注意事项

在php5.3以后,php加入匿名函数的使用,今天在使用匿名的时候出现错误,不能想php函数那样声明和使用,详细看代码

$callback=function(){
  return "aa";
};
echo $callback();
 这是打印出来是aa;

看下面的例子:

echo $callback();
$callback=function(){
  return "aa";
};
 这是报错了!报的错误时:

Notice: Undefined variable: callback in D:\php\www\zf2\public\04.php on line 9
Fatal error: Function name must be a string in D:\php\www\zf2\public\04.php on line 9

$callback为未声明,

但是使用php自己声明的函数都不会报错的!

function callback(){
  return "aa";
}
echo callback();  //aa
 
echo callback();  //aa
function callback(){
  return "aa";
}
 这两个都打印出来aa;

在使用匿名函数的时候,匿名函数当做变量,须提前声明,js中也是这样的!!!!!

用户注册对于初学php的朋友来说是非常实用的一个可以帮助你深入了解数据查询验证与数据入库及安全的一个比较经典的实现了,下面一起来看看。


 php写了一个简单的用户注册页面。本篇结合前一篇的内容,将注册页面上提交的信息post 给后面的页面register.php ,register.php将post的信息提交入库。

一、创建数据库与表结构

1、建库

mysql> create database 361way character set utf8;
Query OK, 1 row affected (0.00 sec)
上面我建了一个同我站点同命的库361way 。

2、创建表结构

CREATE TABLE IF NOT EXISTS `tblmember` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fName` varchar(30) NOT NULL,
  `lName` varchar(30) NOT NULL,
  `email` varchar(50) NOT NULL,
  `password` varchar(60) NOT NULL,
  `birthdate` text NOT NULL,
  `gender` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
这里的字符编码我选择的是utf8 ,并且在该表的id值是从11开始的(前面预留了10个),数据库引擎类型用的InnoDB,具体可以根据自己的需求修改。

二、post提交php页面

向后端提交post请求的register.php代码如下:

<?php
//set up mysql connection
mysql_connect("localhost", "root", "123456") or die(mysql_error());
//select database
mysql_select_db("361way") or die(mysql_error());
//get the value from the posted data and store it to a respected variable
$fName     = $_POST['fName'];
$lName     = $_POST['lName'];
$email     = $_POST['email'];
$reemail   = $_POST['reemail'];
$password  = sha1($_POST['password']);
$month     = $_POST['month'];
$day       = $_POST['day'];
$year      = $_POST['year'];
$gender    = $_POST['optionsRadios'];
$birthdate = $year . '-' . $month . '-' . $day;
//insert data using insert into statement
$query = "INSERT INTO tblmember(id, fName, lName, email, password, birthdate, gender)
                    VALUES (NULL, '{$fName}', '{$lName}', '{$email}', '{$password}', '{$birthdate}', '{$gender}')";
//execute the query
if (mysql_query($query)) {
    //dislay a message box that the saving is successfully save
    echo "<script type=\"text/javascript\">
                alert(\"New member added successfully.\");
                window.location = \"registration.php\"
            </script>";
} else
    die("Failed: " . mysql_error());
?>

上面的代码使用时,数据库的用户名密码及库名根据实际情况修改。

三、测试代码

按上一篇的注册页面输入相关信息并提交后,会弹出如下信息,表示注册成功:

register-mysql

再看下mysql 里的信息:

mysql> select * from tblmember;
+----+-------+-------+------------------+------------------------------------------+-------------+--------+
| id | fName | lName | email            | password                                 | birthdate   | gender |
+----+-------+-------+------------------+------------------------------------------+-------------+--------+
| 10 | test  | yang  | admin@361way.com | a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 | 1997-Jan-28 | Female |
| 11 | aaa   | bbb   | test@91it.org    | 54df472f438b86fc96d68b8454183394ef26b8ac | 1997-Jan-18 | Female |
+----+-------+-------+------------------+------------------------------------------+-------------+--------+
2 rows in set (0.00 sec)


我执行了两次注册,这里有两台记录。

[!--infotagslink--]

相关文章

  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • ps把文字背景变透明的操作方法

    ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
  • intellij idea快速查看当前类中的所有方法(推荐)

    这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • Mysql select语句设置默认值的方法

    1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
  • js导出table数据到excel即导出为EXCEL文档的方法

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • js基础知识(公有方法、私有方法、特权方法)

    本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
  • ps怎么制作倒影 ps设计倒影的方法

    ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果&#819...2017-07-06
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • c#中分割字符串的几种方法

    单个字符分割 string s="abcdeabcdeabcde"; string[] sArray=s.Split('c'); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab de...2020-06-25
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24