php/h02AssBT.php

<?php
require_once('env.php');
outBegin();
outH('assert');
out("ini_get: zend.assertions=" . ini_get('zend.assertions') . ", assert.exception=" . ini_get('assert.exception') . ' warning -1 means not compiled in!');
assertDemo();
ini_set('zend.assertions', 0); 
ini_set('assert.exception', 0); 
out("set zend.assertions=" . ini_get('zend.assertions') . ", assert.exception=" . ini_get('assert.exception'));
assertDemo();
ini_set('zend.assertions', 1); 
ini_set('assert.exception', 0); 
out("set zend.assertions=" . ini_get('zend.assertions') . ", assert.exception=" . ini_get('assert.exception'));
assertDemo();
ini_set('zend.assertions', 1); 
ini_set('assert.exception', 1); 
out("set zend.assertions=" . ini_get('zend.assertions') . ", assert.exception=" . ini_get('assert.exception'));
assertDemo();
out("old assert.callback =", ini_set('assert.callback', 'assCB'), ", new=assCB");
assertDemo();
trigger_error('call trigger_error', E_USER_NOTICE);
outH('definedVars');
testDefinedVars(2);
outH('backtrace');
phpDemoBacktrace(5);
outEnd(__file__);

function assCB() {
    out("assCB", func_get_args());
    return 'assCB return';
}

function testDefinedVars($i, $a=[]) {
    $j = [$i, "i**2=" . ($i*$i)];
    out('get_defined_vars', get_defined_vars());
    if ($i > 0) 
        testDefinedVars($i-1, $j);
}
function assertDemo() {
    $x1 = 7;
        out('assertDemo 1: true, text');
    assert($x1, 'var x1=7');
    out('assertDemo 2: false, text');
    try {
        assert($x1 - $x1 , 'var x1 -x1');
    } catch (Error $e) {
        out('Caught exception: ',  get_class($e), $e->getMessage());
    }
    out('assertDemo 3: false, notext');
    try {
        assert($x1 - $x1);
    } catch (Error $e) {
        out('Caught Error: ',  get_class($e), $e->getMessage());
    }
    out('assertDemo 4: false, Error');
    try {
        assert($x1 - $x1, new Error('new error in assert'));
    } catch (Error $e) {
        out('Caught Error: ',  get_class($e), $e->getMessage(), $e->getPrevious());
    }
    out('assertDemo 5: true, eval eAsrt');
    eval(eAsrt('$x1 +  $x2', "eval eAsrt x1=$x1"));
    out('assertDemo 6: false, eval eAsrt');
    eval(eAsrt('$x1 -  $x2', "eval eAsrt x1=$x1"));
}

function eAsrt($c, $i) {
    if (0)
        return null;
    elseif (1)
        return "assert( $c, tAsrt('$i ==> $c'));";
    else
        return "{ try { \$q = $c; \$r=''; } catch (Throwable \$t) {\$q=0; \$r= ((string) \$t) . ' ??? ';} assert( \$q, '$i ==> \$t$c'); }";
}

function tAsrt($t)  {
    echo "tAsrt $t\n";
    return  "tAsrt $t";
}

function phpDemoBacktrace($l) {
    if ($l > 0)
        phpDemoBacktrace($l-1);
    else {
        outUL();
        outWEC('debug_print_backtrace; before ob_start DEBUG_BACKTRACE_IGNORE_ARGS', DEBUG_BACKTRACE_IGNORE_ARGS );
        ob_start();
        debug_print_backtrace(0, 0);
        for ($tr = ob_get_contents(); substr($tr, strlen($tr)-strlen(PHP_EOL)) == PHP_EOL; 
            $tr = substr($tr, 0, strlen($tr)-strlen(PHP_EOL))) {}
        ob_end_clean();
        outLi("backtrace Formatted after ob_end at", __file__,  __line__);
        outOL();
        foreach(explode("\n", $tr) as $l)
            outLi($l);
        outOLEnd();
        outLi("end debug_print_backtrace");
        outLi('mit debug_backtrace @', __line__, __file__);
        outOL();
        foreach(debug_backtrace() as $l)
            outLi($l);
        outOLEnd();
        outLi('end debug_backtrace');
        outLi('mit function backtrace@', __line__, __file__);
        backtrace();
        outLi('mit trigger_error');
        trigger_error("trigger error to get backtrace");
        
        outULEnd('after function backtrace');
        }
}

function backtrace($num=7) { // returns backtrace, html formatted
        ob_start();
        debug_print_backtrace(0 , $num);
        for ($tr = ob_get_contents(); substr($tr, strlen($tr)-strlen(PHP_EOL)) == PHP_EOL; 
                    $tr = substr($tr, 0, strlen($tr)-strlen(PHP_EOL))) {}
        ob_end_clean();
        outUL();
        foreach(explode("\n", $tr) as $l)
            outLi($l);
        outULEnd();
}

?>