【问题标题】:Accessing variable from outside class definition?从外部类定义访问变量?
【发布时间】:2013-12-26 16:32:17
【问题描述】:

我是 PHP 新手,我对它的“函数式编程”方面知之甚少。我正在使用一个似乎遵循“面向对象编程”风格的插件,并且希望访问一个变量以在我自己的函数中使用。我不知道该怎么做。

给你一个想法,插件中的类定义是这样的(有点):

<?php

    class WPSEO_Frontend {
        public function canonical() {
            $canonical = get_page_link();
        }
    }
?>

插件中的另一个文件如何调用变量$canonical

<?php
    class WPSEO_Twitter extends WPSEO_Frontend {
        public function twitter_url() {
            echo '<meta name="twitter:url" content="' . esc_url( $this->canonical() ) . '"/>' . "\n";
        }
    }
?>

现在,我希望能够在我的函数中的不同文件中访问 $canonical 变量(以函数式编程风格)。例如,像这样:

<?php
    function seo_meta_tags() {
        echo '<meta property="og:url" content="' . $canonical . '">' . PHP_EOL;
    }
?>

我该怎么做?有可能吗?

PS:据我所知,我不知道我是否遗漏了什么,所以请告诉我。

【问题讨论】:

  • 也许可以试试WPSEO_Frontend::canonical()
  • @TheHumbleRat 我收到此错误:严格标准: 不应静态调用非静态方法 WPSEO_Frontend::canonical()
  • 是的,它不是静态方法,或者在定义中会说静态。
  • 您可以将public function actionPurchaseOrderNumberS1($pp_purordnum) 更改为此public static function actionPurchaseOrderNumberS1($pp_purordnum)。但是您可能对其他答案更好,我自己对此还是很陌生。
  • 不,您不应该直接编辑插件的代码,特别是如果您不了解 OOP,而且我不知道 @TheHumbleRat 从哪里得到该函数名称...

标签: php wordpress scope procedural-programming


【解决方案1】:

这里有几个问题。

  1. 您的 WPSEO_Frontend::canonical 函数应该返回一个值,以便在您的代码的其他部分调用该函数时返回一个值而不是 void。
  2. 由于canonicalWPSEO_Frontend 的成员函数,您需要拥有WPSEO_Frontend 的实例才能调用canonical 函数。

更新WPSEO_Frontend::canonical函数以返回get_page_link()

<?php

    class WPSEO_Frontend {
        public function canonical() {
            return get_page_link();
        }
    }
?>

然后在您的seo_meta_tags 函数中使用WPSEO_Frontend 的实例来调用canonical

<?php
    function seo_meta_tags() {
        $wp_seo_frontend = new WPSEO_Frontend();
        echo '<meta property="og:url" content="' . $wp_seo_frontend->canonical() . '">' . PHP_EOL;
    }
?>

【讨论】:

  • 这个答案没有回答问题
  • @link,我相信我在您发表评论时添加了所需的代码更改。无论如何,感谢您提供的任何其他反馈。
  • @vee 工作就像一个魅力,非常感谢你的清晰示例。
  • @vee 好像有点小问题。在我的函数中添加$wp_seo_frontend = new WPSEO_Frontend(); 后,插件的原始输出会显示两次。 (无论我的代码是什么意思,它都能正常工作。插件本身由于那条线而搞砸了。)知道为什么吗?
  • 没关系。 WPSEO_Frontend() 已经被插件实例化并且可以作为全局变量 $wpseo_front 现在,我可以像 $wpseo_front-&gt;canonical( false ) 这样简单地使用它。 github.com/Yoast/wordpress-seo/blob/master/frontend/….
【解决方案2】:

您需要有一个 WPSEO_Frontend 类(或扩展它的类)的实例。我会叫它$instance。然后,您将该变量传递给您的函数。

我假设第一个函数要么返回值,要么使用 $this 关键字将其设置为属性。

WPSEO_Frontend 类可能具有该属性的 getter 函数,因此您可能需要这样做

$instance->getCanonical();

或者只是

$instance->canonical;

如果没有看到更多实际代码,我们无法告诉您更多信息。如果函数canonical() 确实返回了一些东西,那就是要调用的函数。

【讨论】:

  • 如果你可以看一下,它是一个开源插件。我的问题中的第一个代码块:github.com/Yoast/wordpress-seo/blob/master/frontend/…,这是第二个:github.com/Yoast/wordpress-seo/blob/master/frontend/…
  • 所以,是的,它确实返回了一些东西,所以你可以调用 canonical();在您执行 seo_meta_tags 函数的代码中,您是否已经拥有该其他类的实例?
  • 不,我不知道。我创建了一个如@vee 的答案所示的,它有效!非常感谢您的宝贵时间。 (编辑:没有看到您编辑的评论。)
  • 知道如何在不弄乱插件的情况下创建实例吗?在我的函数中添加$wp_seo_frontend = new WPSEO_Frontend(); 后,插件的原始输出会显示两次。 (无论我的代码是什么意思,它都可以正常工作。由于那条线,插件本身就搞砸了。)
  • 啊,你说的太对了。插件本身定义了一个全局变量$wpseo_front!现在,我可以简单地使用它。 github.com/Yoast/wordpress-seo/blob/master/frontend/…。感激不尽。
猜你喜欢
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多