anonymous functions (lambdas, closures) in PHP 4

前端 未结 2 1391
清歌不尽
清歌不尽 2021-01-22 20:01

Is there a trick in PHP 4 to implement functions which return functions? I expected that the following code would work:

function xxx($a) {
  return function($b)          


        
2条回答
  •  情歌与酒
    2021-01-22 20:35

    In PHP4 you can use Variable Functions like this, provided your function is already defined in the scope (so not a real closure).

    THIS IS DIRTY CODE. THIS IS NOT MUCH TESTED. THIS IS NOT FAST (even slower than closures if that is possible). It is just for fun and proving it "somehow" can be done if you really really need it.

    Requires a writable tmp/ directory.

        ');
            fclose($handle);
            include($tmpfname);
            unlink($tmpfname);
    
            return 'func_'.($sid);
        }
    
    
        $result=xxx(32);
    
        $result(20);
    
    
    
    
    
    
    
        // This is just to get a unique identifier for every connection and every function call:
        // UNIVERSALSESSIONIDS v1.3
    
        if(defined('UNIVERSALSESSIONIDS')) return;
        define('UNIVERSALSESSIONIDS', TRUE);
    
    
    
    
        function GetTimeStart() {
            return strtotime('2006-07-10');
        }
    
        function GetUniversalSessionId() {
            return GetCodedSid(letterNumBase(),16);
        }
        function GetCodedSid($baseChars,$Pad=0) {
            $Zero=$baseChars{0};
            list ($usec, $sec) = explode (' ', microtime());
            $new_sid =  ($sec-GetTimeStart()) . str_pad ((int)($usec * 100000000), 8, '0', STR_PAD_LEFT) . str_pad (rand (0, 9999), 4, '0', STR_PAD_LEFT);
    
            $new_sid=ConvertDecToAnyStr($new_sid,$baseChars);
            $new_sid=str_pad ($new_sid, $Pad, $Zero, STR_PAD_LEFT);
            return $new_sid;
        }
    
        function divide($decstr,$decnum) {
            $Start='';
            $Result='';
            $WRITE=FALSE;
            do {
                $Start.=substr($decstr,0,1);
                $decstr=substr($decstr,1);
    
                $DecStart=intval($Start);
    
                $Rest=$DecStart%$decnum;
                $PartDiv=($DecStart-$Rest)/$decnum;
                if($PartDiv>0) $WRITE=TRUE;
    
                if($WRITE) $Result.=$PartDiv;
                $Start=$Rest;
    
            } while ($decstr!='');
            if($Result=='') $Result='0';
            return array($Result,$Rest);
        }
    
        function bigBase() {
            global $gSavedBigBase;
    
            if(isset($gSavedBigBase)) return $gSavedBigBase;
            $BigBase='';
            for($i=33;$i<=128;$i++) $BigBase.=chr($i);
            $gSavedBigBase=$BigBase;
            return $BigBase;
        }
    
        function letterNumBase() {
            global $gSavedBigBase2;
    
            if(isset($gSavedBigBase2)) return $gSavedBigBase2;
            $BigBase='';
            for($i=ord('0');$i<=ord('1');$i++) $BigBase.=chr($i);
            for($i=ord('A');$i<=ord('Z');$i++) $BigBase.=chr($i);
            $BigBase.='_';
            // for($i=ord('a');$i<=ord('z');$i++) $BigBase.=chr($i);
            $gSavedBigBase2=$BigBase;
            return $BigBase;
        }
    
        function ConvertDecToAny($decstr,$decbase) {
            $Result=array();
    
            do {
                $Div=divide($decstr,$decbase);
                $decstr=$Div[0];
    
                $Rest=$Div[1];
                $Result[]=$Rest;
    
            } while($decstr!='0');
    
            return $Result;
        }
    
        function ConvertDecToAnyStr($decstr,$baseChars='01') {
    
            $decbase=strlen($baseChars);
    
            $Result='';
    
            do {
                $Div=divide($decstr,$decbase);
                $decstr=$Div[0];
    
                $Rest=$Div[1];
                $Result=$baseChars{$Rest}.$Result;
    
            } while($decstr!='0');
    
            return $Result;
        }
    
    
        ?>
    

提交回复
热议问题