-1

我知道您可以在 PHP 中使用嵌套函数。

这是问题:

我有这个代码:

    class ClassName
    {
        private $data;

        function __construct()
        {

        }

        public function myFunction()
        {
            if($condition1 != NULL)
            {
                if(!empty($condition2) && $this->data->condition3 == NULL)
                {

                    $this->do1($condition2);
                    $this->do3($condition2);
                    $this->do3($condition2);
                    $this->doBLAH();

                }
                elseif(empty($checkoutItem->rebillCheckoutItemId))
                {
                    $this->do1($condition2);
                    $this->do3($condition2);
                    $this->do3($condition2);
                    $this->doSomethingElse();

                }
            }               

        }

    }

如您所见,这部分是多余的:

$this->do1($condition2);
$this->do3($condition2);
$this->do3($condition2);

所以摆脱冗余,我可以创建一个新方法:

    private function doSomething($condition2)
    {
        $this->do1($condition2);
        $this->do3($condition2);
        $this->do3($condition2);        
    }

但我不想。它可能真的把我的代码搞砸了。

只是想知道是否可以做类似的事情:

        public function myFunction()
        {
            if($condition1 != NULL)
            {
                if(!empty($condition2) && $this->data->condition3 == NULL)
                {

                    $this->doSomething($condition2);
                    $this->doBLAH();

                }
                elseif(empty($checkoutItem->rebillCheckoutItemId))
                {
                    $this->doSomething($condition2);
                    $this->doSomethingElse();

                }
            }
            function doSomething($condition2)
            {
                $this->do1($condition2);
                $this->do3($condition2);
                $this->do3($condition2);        
            }               

        }

我试过了,但它抛出了一个Fatal error: Call to undefined function doSomething(). 有什么技巧吗?难道我做错了什么?

更新

我在 YII 框架中工作,它给了我一个例外:BlahWidget and its behaviors do not have a method or closure named "doSomething"

4

2 回答 2

2

您可以改为在本地范围内定义匿名函数。否则,该函数仍将定义在全局范围或命名空间中。

这应该从 PHP 5.4 开始工作,因为 $this 在闭包中使用。在 5.3 中,您将需要做额外的体操。见下文。

    public function myFunction()
    {
        $do = function ($condition2) {
            $this->do1($condition2);
            $this->do3($condition2);
            $this->do3($condition2);        
        };

        if($condition1 != NULL)
        {
            if(!empty($condition2) && $this->data->condition3 == NULL)
            {

                $do($condition2);
                $this->doBLAH();

            }
            elseif(empty($checkoutItem->rebillCheckoutItemId))
            {
                $do($condition2);
                $this->doSomethingElse();

            }
        }               

    }

现在是5.3版本。请注意,调用的函数需要是公共的。

    public function myFunction()
    {
        $that = $this;
        $do = function ($condition2) use ($that) {
            $that->do1($condition2);
            $that->do3($condition2);
            $that->do3($condition2);        
        };

        if($condition1 != NULL)
        {
            if(!empty($condition2) && $this->data->condition3 == NULL)
            {

                $do($condition2);
                $this->doBLAH();

            }
            elseif(empty($checkoutItem->rebillCheckoutItemId))
            {
                $do($condition2);
                $this->doSomethingElse();

            }
        }               

    }

在这样的示例中,对于 5.3,我宁愿在类上创建一个私有方法。

于 2013-03-22T15:42:32.757 回答
0

首先,你不能有一个名为do(). 它是保留的。

因此,让我们将您的更改do()do_somthing(). 然后你需要在$this->do_something()任何你想使用它的地方调用它。

于 2013-03-22T15:37:36.610 回答