function foo($arg){
  function bar(){
    //这里怎样才能访问到 $arg
  }
}我发现可以这样在函数内部定义函数, 并认为很有用
但是,如何解决访问外层变量的问题? 如果是js这个问题就不存在了

解决方案 »

  1.   


    $a=4; 
    function c(){ 
    global $a;
    $b=1; 
    echo $a*$b; 

    c(); 
    在函数里面全局化变量$a就可以了 你也可以用“类”来实现这个效果…… 
    class aa{
        var $a;
        function b(){
            $b = 1;
            echo intval($this -> a)*$b;
        }
    }
    $obj = new aa();
    $obj->a = 4;
    $obj -> b();
      

  2.   

    各位提到的方法我知道,但我想知道的就是这种函数套函数的情况下怎么处理,$arg的作用域是在foo之内,global不适用
      

  3.   

    如果访问caller function的实参值,还有办法访问到,如果访问caller function内部定义的局部变量,恐怕就必须得直接作为参数传给内部的function了。
    利用debug_backtrace函数可以往外追溯函数调用的过程。
    function a($arg,$arg2)
    {
    function b()
    {
    $b = debug_backtrace();
    foreach($b as $k=>$v)
    {
    if($v['function'] !== __FUNCTION__) print_r($v['args']);
    }
    }
    b();
    }
    a('hello world','hello china');
      

  4.   

    function   foo($arg){ 
        $val = $arg;
        function   bar($val){ 
        } 
    }用参数传啊
      

  5.   

    这也能用?试试function   foo($arg){
        function   bar(){
    global $arg;
    echo $arg;
            //这里怎样才能访问到   $arg
        }
      

  6.   

    用参数传的话,这种情况恐怕不行
    function   foo($arg){
        function   bar(){
            //这里怎样才能访问到   $arg
        }
        preg_replace_callback("/a/","A","bar",$text)
    }
    也就是做为 preg_replace_callback 的回调函数
    其实我主要是用于这种情况
      

  7.   

    早把问题说清楚呀...
    function  foo($arg){
        function  bar(){
            //这里怎样才能访问到  $arg
    $n = func_get_args();
    print_r($n);
        } $text = 'abc';
        preg_replace("/abc/ie","bar('\\0','".$arg."')",$text);
    } foo('hello world!');
      

  8.   

    嗯,15楼的很棒<?php
    function format($text,$hs){
    function bar($key,$ptn,$hs){
    return $hs[$key];
    }
    return preg_replace("/\{\\$([^}]+?)(?::([^}]+?))?\}/ie","bar('$1','$2',\$hs)",$text);
    }
    echo format('I say {$text}',array('text'=>'hello world!'));
    ?>我写了个东西,比较爽