2

可能重复:
具有类属性的默认方法参数?

我正在编写一个递归函数,只是为了便于使用,我希望函数的第一次调用接受默认参数。该值必须是对象成员变量的地址。请参阅下面的完整代码:

class Test{
    public $hierarchy = array( );
    public function addPath( $path, &$hierarchy ){
        $dirs = explode( '/', $path );
        if( count( $dirs ) == 1 ){
            if( is_dir( $path ) )
                $hierarchy[ $dirs[ 0 ] ] = '';
            else
                $hierarchy[ $path ] = '';
            return $hierarchy;
        }
        $pop = array_shift( $dirs );
        $hierarchy[ $pop ] = $this->addPath( 
            implode( '/', $dirs ), $hirearchy[ $pop ] );

        return $hierarchy;
    }
}

$t = new Test( );
$t->addPath( '_inc/test/sgsg', $t->hierarchy );
print_r( $t->hierarchy );

现在,我想在这里理想地做的是添加一个默认值:

public function addPath( $path, &$hierarchy = $this->hierarchy ){

所以我可以这样称呼它:

$t->addPath( '_inc/test/sgsg' );

但这给了我以下错误:

Parse error: syntax error, unexpected '$this' (T_VARIABLE) in tst.php on line 9

我一直在尝试一些没有成功的事情。有什么办法可以做到这一点?

4

1 回答 1

2

不幸的是,您不能这样做,解析器不(不能!)满足解析函数定义中的变量。

但是,您可以在定义中定义函数&$hierarchy = null并使用它is_null来查看是否传递了值。(除非您的引用值有时为空,否则您将需要另一种解决方法)

如果is_null返回 true 那么你可以分配$hierarchy = &$this->hierarchy


在 PHP 聊天中快速讨论之后,使用func_num_args()在这里可能有用。它不计算填充有默认值的参数,因此您可以安全地传递包含null引用的变量,并使用此函数来确定值$hierarchy是来自传递的参数还是默认值。(感谢@NikiC)

于 2012-10-01T16:10:12.590 回答