【问题标题】:PHP: Retrieving instance of class method from another classPHP:从另一个类中检索类方法的实例
【发布时间】:2014-10-27 03:58:09
【问题描述】:

我正在尝试将 WordPress 标头引入我的应用程序。 我有这个类与 Wordpress 连接并提取我需要的 HTML:

namespace XLite\Module\Guru\WordPress;

/**
 * Main module
 */
class WordPress extends \XLite\Base\Singleton
{
    /**
     * Get WordPress header and body class
     *
     * @return array
     */
    public static function getWPHeader($element){

        $WP = array();

        require_once(__DIR__ . '../../../../../../../../../wp-blog-header.php');
        $wpHeader = self::ob_get_call('get_header');

        if (!isset($dom)) {
            $dom = new \domDocument;
        }
        $dom->loadHTML($wpHeader);

        //Get body class
        $bodyElements = $dom->getElementsByTagName("body");
        foreach ($bodyElements as $node) {
            $bodyClass = substr($node->getAttribute('class'), 5);
        }
        $WP['bodyClass'] = $bodyClass;

        $headerElement = $dom->getElementById("masthead");
        $WP['header'] = $dom->saveHTML($headerElement);

        return $WP;
    }
}

而且这段代码会执行得很好。我在另一个文件中引用它,如下所示:

namespace XLite\Module\Guru\WordPress\View\Header\Customer;

/**
 * Header
 *
 * @ListChild (list="body", zone="customer", weight="10")
 */
class Header extends \XLite\View\Menu\Customer\ACustomer
{
    /**
     * Get WordPress Header
     *
     * @return html
     */
    public function getWPHeader(){
        $wpHeader = \XLite\Module\Guru\WordPress\WordPress::getWPHeader();

        echo $wpHeader['header'];
    }
}

这行得通!我可以回显标题 HTML。但是我需要再次访问同一个类,以便可以附加正文样式:

namespace XLite\Module\Guru\WordPress\View;

/**
 * Replace Body Template
 */
abstract class Controller extends \XLite\View\ControllerAbstract implements \XLite\Base\IDecorator
{
    /**
     * Get WordPress Body class
     *
     * @return string
     */
    public function getWPBodyClass(){
        $wpHeader = \XLite\Module\Guru\WordPress\WordPress::getWPHeader();

        echo $wpHeader['bodyClass'];
    }
}

当两个文件都处于活动状态时,只有一个显示来自 WordPress 类的内容。如果我注释掉或删除任何一个查看器类,另一个会出现。我认为我只需要访问一次类,并将我需要的数据存储在一个实例中。但我真的迷路了,代码实际上更复杂,这让我头晕目眩。 :-) 在此先感谢,我已经潜伏在这个网站上将近 10 年了。

【问题讨论】:

    标签: php wordpress oop namespaces


    【解决方案1】:

    我的好朋友 Tony Sologubov 通过 Facebook 回复了我: “我相信,问题在于你调用了 WP 例程两次。尝试在你的 Worpdress 类中做这样的事情:

    <?php
    
    // storing wpHeader data in this property
    protected static $wpHeader = null;
    
    public static function getWPHeader($element) {
        if (!isset(self::$wpHeader)) {
            // your current implementation of this method
            // save results into self::$wpHeader
        }
    
        return self::$wpHeader;
    }
    

    "

    他说的很对,我将他的建议执行如下:

    protected static $wpHeader = null;
    
    //$wpHeader = $this->getWPHeader();
    
    /**
     * Get WordPress header
     *
     * @return array
     */
    public static function getWPHeader(){
    
        //$WP = array();
        if (!isset(self::$wpHeader)) {
            require_once(__DIR__ . '../../../../../../../../../wp-blog-header.php');
    
            $wpHeader = self::ob_get_call('get_header');
    
    
            if (!isset($dom)) {
                $dom = new \domDocument;
            }
    
            $dom->loadHTML($wpHeader);
    
            $headerElement = $dom->getElementById("masthead");
    
            self::$wpHeader = $dom->saveHTML($headerElement);
    
            //echo $Header;
        }
    
        return self::$wpHeader;
    }
    

    并像上面一样访问它。谢谢托尼!!!因为你,我今天学到了很多关于 OOP PHP 的知识。

    【讨论】:

      猜你喜欢
      • 2015-06-10
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多