【问题标题】:How to share an instance across several php files a-la-Wordpress?如何在多个 php 文件 a-la-Wordpress 之间共享一个实例?
【发布时间】:2011-03-14 10:25:52
【问题描述】:

大家好,

我目前使用 Wordpress 作为我的 CMS,并利用 Facebook 的 Graph API 来处理用户帐户/注册“资料”。

我的问题是,当 Wordpress 编译多个 php 文件以输出单个网页时,如何使用 Facebook 的 PHP SDK(可在此处找到:http://github.com/facebook/php-sdk/)?换句话说,Wordpress 的模板 header.php + index.php + footer.php = 你在 www.example.com 上看到的

如果我在 HEADER.PHP 中创建 Facebook 应用程序的实例,我将如何在 INDEX.PHPFOOTER.PHP?

提前致谢!

----- 示例代码 ---

在 header.php 中

<?php
require '/facebook.php';

// Create our Application instance.
$facebook = new Facebook(array(
  'appId' => 'xxx',
  'secret' => 'xxx',
  'cookie' => true,
));
?>

在 index.php 中

<?php
$session = $facebook->getSession();
?>

【问题讨论】:

    标签: php wordpress facebook


    【解决方案1】:

    在 header.php 文件中包含 facebook 客户端并创建一个实例后:

    $facebook = new Facebook('API', 'SECRET');
    

    然后,您可以从 index.php 文件或什至 footer.php 文件或包含 header.php 的任何其他文件访问 facebook 客户端实例 $facebook

    【讨论】:

    • 你确定?这是我在标头中启动然后在 index.php 中调用东西后得到的 致命错误:调用非对象中的成员函数 getSession()
    • @st4ck0v3rfl0w:您还应该发布您的示例代码,看看您实际上是如何做到的。它可以进一步帮助我们。
    【解决方案2】:

    PHP 是按顺序处理的,也就是说,在调用发生在 index.php 之前,您需要确保包含 header.php。总体而言,您可能有这样的情况:

    在 index.php 中

    <?php
    // blah blah other code
    $session = $facebook->getSession();
    // blah blah more code
    include('header.php');
    

    当然会读作:

    <?php
    // blah blah other code
    $session = $facebook->getSession();
    // blah blah more code
    require '/facebook.php';
    // Create our Application instance.
    $facebook = new Facebook(array(
      'appId' => 'xxx',
      'secret' => 'xxx',
      'cookie' => true,
    ));
    

    当您查看整体代码时,您会发现 $facebook 尚不存在。

    var_dump($facebook); 添加到header.php 的末尾(在您设置$facebook 和一个到index.php 的开头(在您尝试使用$facebook 之前)。

    另一件事可能是您调用Facebook Graph API 无法正常工作并返回false 或其他内容。如果$facebook 存在并且没有正确连接(或类似的东西),您的var_dump 输出将是相同的,但如果您在设置之前尝试访问$facebook,则会有所不同(一个将是@ 987654334@ 并将生成一个 E_NOTICE,另一个将是 Facebook 对象 - 或从 Facebook Graph API 调用返回的任何内容。

    【讨论】:

    • 实际上....当我在 index.php 中创建 $facebook 实例时,我刚刚在 header.php 中执行了 vardump,它返回 NULL。当我在 header.php 中创建实例时,我也以相反的方式在 index.php 中执行了 vardump,它也返回了 NULL ..... 发生了什么事!?
    • var_dump($facebook) 返回nullvar_dump($facebook-&gt;getSession()) 返回null?如果是前者,那么你没有正确连接到 Facebook,如果是后者,那是因为你没有 Facebook 会话,请确保你有一个“连接到 Facebook”按钮或类似的东西。
    【解决方案3】:

    如果您在header.php 中设置$facebook,则您将无法index.php 中访问它,除非您将其全球化。

    这是因为header.php 是通过函数get_header() 加载的,它缩小了所有非全局变量的the scope

    所以你可以全球化$facebook,因为你想要Facebook的单个实例,我强烈建议使用singleton helper function

    function get_facebook_instance()
    {
        static $f;
        if (!isset($f)) {
            if (!class_exists('Facebook'))
                require('/facebook.php');
            $f = new Facebook(array(
                'appId' => 'xxx',
                'secret' => 'xxx',
                'cookie' => true,
            ));
        }
        return $f;
    }
    

    注意:如果您使用的是 PHP5,则不必担心通过引用返回。

    【讨论】:

    • 谢谢@TheDeadMedic。你是对的。我将实例辅助函数放在 functions.php 中,现在可以访问变量了。
    • 很好的答案@TheDeadMedic 和很好的引导链接:)
    • 这个答案看起来正是我所需要的。我还是有点好奇如何从模板文件中访问 SDK。是使用 $facebook 还是 $f?我必须先在每个模板文件中调用 get_facebook_instance(),还是在函数中调用一次?我需要从 add_action 挂钩调用 get_facebook_instance 吗?
    • get_facebook_instance() 仅返回 SDK 类的静态实例。只需将它分配给每个需要它的模板文件开头的变量 ($whatever = get_facebook_instance()),然后使用 $whatever-&gt;sdk_method()
    【解决方案4】:

    考虑使用已经实现此功能的 Wordpress Facebook Connect 插件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多