zoukankan      html  css  js  c++  java
  • assert函数的用法

    assert这个函数在php语言中是用来判断一个表达式是否成立。返回true or false;
    例如:
    <?php
    $s = 123;
    assert("is_int($s)");
    ?>
    从这个例子可以看到字符串参数会被执行,这跟eval()类似。不过eval($code_str)只是执行符合php编码规范的$code_str。
    assert的用法却更详细一点。

    assert_option()可以用来对assert()进行一些约束和控制;
    默认值
    ASSERT_ACTIVE=1 //Assert函数的开关
    ASSERT_WARNING =1 //当表达式为false时,是否要输出警告性的错误提示,issue a PHP warning for each failed assertion
    ASSERT_BAIL= 0 //是否要中止运行;terminate execution on failed assertions
    ASSERT_QUIET_EVAL= 0 //是否关闭错误提示,在执行表达式时;disable error_reporting during assertion expression evaluation
    ASSERT_CALLBACK= (NULL) // 是否启动回调函数 user function to call on failed assertions

    如果按照默认值来,在程序的运行过程中调用assert()来进行判断表达式,遇到false时程序也是会继续执行的,这在生产环境中这样使用是不好的,而 在开发调试环境中,却是一种debug的不错的方式。特别是用上callback的方法,可以知道具体的出错信息。例如:

    <?php
    // Active assert and make it quiet
    assert_options(ASSERT_ACTIVE, 1);
    assert_options(ASSERT_WARNING, 0);
    assert_options(ASSERT_QUIET_EVAL, 1);
    
    // Create a handler function
    function my_assert_handler($file, $line, $code)
    {
        echo "<hr>Assertion Failed:File '$file'<br />Line '$line'<br />Code '$code'<br /><hr />";
    }
    
    // Set up the callback
    assert_options(ASSERT_CALLBACK, 'my_assert_handler');
    
    // Make an assertion that should fail
    assert('mysql_query("")');
    ?>
    所以,php的官方文档里头是建议将assert用来进行debug,我们可以发现还有一个开关ASSERT_ACTIVE可以用来控制是否开启debug。


    现在问题就产生了,如果程序员在开发的时候在代码中留下了很多assert(),然后在程序发布的时候关闭执行,设置assert_options(ASSERT_ACTIVE,0);这样做是否可行?有没有安全问题?

    我的建议是,既然assert主要作用是debug,就不要在程序发布的时候还留着它。在程序中用assert来对表达进行判断是不明智的,原因上文说了, 一个是在生产环境中assert可能被disabled,所以assert不能被完全信任;二是assert()可以被继续执行;而如果在生产环境让ASSERT_ACTIVE=1,那这个表达式字符串可以被执行本身就存在安全隐患。例如:

    <?php
    function fo(){
      $fp = fopen("c:/test.php",'w');
      fwrite($fp,"123");
      fclose($fp);
      return true;
    }
    assert("fo()");
    ?>


  • 相关阅读:
    解决:Google代码achartengine曲线代码报错问题(转)
    操作SQLite数据库
    让服务器iis支持.apk文件下载的设置方法
    怎么在手机上查看sqlite db
    Android 3D滑动菜单完全解析,实现推拉门式的立体特效
    android自动更新程序,安装完以后就什么都没有了,没有出现安装成功的界面的问题
    那些年不错的Android开源项目
    PL/SQL Developer 连接新数据库
    Oracle 连接 Visual Studio 的工具
    利用SQLiteOpenHelper来管理SQLite数据库 (转)
  • 原文地址:https://www.cnblogs.com/moqiang02/p/4061101.html
Copyright © 2011-2022 走看看