我有一个方法,只需要在PHP中执行一次,但将被调用两次。我该如何构建这个?

时间:2012-03-30 10:12:24

标签: php

我在PHP中有一个调用SOAP服务的方法,解析一些数据并返回它。

它将返回相同的数据 - 它会询问数据对象中的记录数。

我需要传球两次。

我的问题是,在PHP中构造这个的最佳实践是什么?我试过看看函数是否已被调用。我是否使用静态变量/函数?

function MinimumRequired() { 
        return $this->NumberPeopleJoined();
    }   

function NumberPeopleJoined () {
        if (isset($NumberPeople)) {
            Debug::Show($NumberPeople);
        }
        static $NumberPeople;
        $NumberPeople = Surge_Controller::NumberPeopleJoined();
        return $NumberPeople;
    }

谢谢!

2 个答案:

答案 0 :(得分:1)

只需创建一个本地类成员,然后检查它是否有值。如果没有,请将值设置为从Surge_Controller检索到的值,如果已经设置,则只返回值:

<?php

class Surge_Controller {
    static public function NumberPeopleJoined() {
        echo "Surge_Controller::NumberPeopleJoined() got called.\n";
        return 2;
    }
}

class Foo {
    protected $cacheNumberPeople;

    function MinimumRequired() { 
        return $this->NumberPeopleJoined();
    }   

    function NumberPeopleJoined () {
        if( !isset( $this->cacheNumberPeople ) ) {
            $this->cacheNumberPeople = Surge_Controller::NumberPeopleJoined();
        }
        return $this->cacheNumberPeople;
    }
}

$foo = new Foo( );
echo $foo->numberPeopleJoined( ) . "\n";
echo $foo->numberPeopleJoined( ) . "\n";

输出:

$ php foo.php
Surge_Controller::NumberPeopleJoined() got called.
2
2

答案 1 :(得分:0)

简单的方法是拥有一个全局变量,并检查是否为“true”,并在函数结束时将其设置为true。该值也可以缓存...

但是如果你想让你的代码变得有趣,你可以使用下划线: http://brianhaveri.github.com/Underscore.php/#once http://brianhaveri.github.com/Underscore.php/#memoize