-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

代わりに、ローカルスコープで無名関数を定義できます。それ以外の場合、関数は引き続きグローバルスコープまたは名前空間で定義されます。

$ thisはクロージャー内で使用されるため、これはPHP5.4から機能するはずです。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 に答える