如何避免在这种情况下重复调用函数


How to avoid repeatedly calling a function in this case?

我写了一个函数来在每个wordpress帖子上显示一个对象:

function pod(){
global $post,$pod;
$id = get_the_ID();
$pod = new WP_POD( $id );
return $pod;
}

我认为$pod是全局的,所以,我可以在需要的时候使用$pod->东西,但它不起作用。因此,在每个函数中,我需要使用对象中的东西,我必须添加一行:

$pod = pod()

我认为反复调用这个函数可能对性能不好。是否有一种方法使此全局和可访问的其他功能?

您要避免使用global关键字。如果你需要把数据拉到一个函数中,这肯定是你的设计出问题的标志(Wordpress也出问题了)。使用依赖注入并将$post和$pod传递给函数(这也可以防止远距离的怪异动作):

function pod($post, $pod)
{
    $id = get_the_ID();
    $pod = new WP_POD( $id );
    return $pod;
}

然而,这仍然没有多大意义。您没有在函数中使用$post,那么为什么要传递它呢?相反,您需要再次到达函数作用域之外以获取某种id。您可以使用它来实例化WP_POD实例并将其分配回全局作用域。

为什么不直接做

function createPod($id)
{
    return new WP_POD($id);
}
然后用 调用
$pod = createPod(get_the_ID());

或者直接删除函数,只执行

$pod = new WP_POD(get_the_ID());

是的,这不会将$pod实例分配到全局作用域,但我怀疑你是否真的需要它。

至于性能:你不应该担心性能,除非你已经分析了你的应用程序并发现它运行缓慢,并且特定的代码确实是导致它变慢的原因。

您可以简单地将对象传递给您正在调用的函数。
或者使用与http://en.wikipedia.org/wiki/Dependency_injection

相关的其他内容

或者,如果这还不能说服你;-),至少通过像

这样的东西限制变量的可见性
function pod($init=false) {
    global $post,$pod;
    static $pod=null;
    if ( is_null($pod) || $init ) {
        $id = get_the_ID();
        $pod = new WP_POD( $id );
    }
    return $pod;
}

见http://docs.php.net/language.oop5.static

您需要在您试图从中访问变量的函数中将$pod声明为全局。变量不能全局访问,除非在PHP中显式声明,这与大多数其他语言不同。

调用pod()一次

然后像这样访问

global $pod;
$pod->stuffs .... 

你可以使用$GLOBALS在脚本中声明变量:

$pod = new WP_POD( get_the_ID() );
function myFunc() {
    $GLOBALS['pod']->aMethod;
}