PHP - 将脚本注入 <head>

Lod*_*der 0 php function str-replace

遇到了一些棘手的情况,我似乎无法用手指环绕。基本上我想要实现的是能够在不同的页面上注入不同的 Javascript 文件。

一些简单的随机示例:

  • 第 1 页:导入jquery.js
  • 第 2 页:导入mootools.js

所以我所做的是,我创建了一个函数,addScript()如下所示:

function addScript($file) {

    $script = '';
    $script .= '<script src="'. REL_PATH . '/path/to/file/' . $file . '">';
    $script .= '</script>';

    return $script;
}
Run Code Online (Sandbox Code Playgroud)

所以如果我调用addScript('jquery.min');它,输出正确。

我现在想要做的是用</head>上述函数的输出替换结束标记。如果我执行以下操作,则它可以正常工作:

ob_start();
require_once("models/header.php");
$contents = ob_get_contents();
ob_end_clean();

echo str_replace('</head>', addScript('jquery.js') . '</head>', $contents);
Run Code Online (Sandbox Code Playgroud)

但是,我希望这更动态一些,因为我可能需要在每个页面上注入多个脚本,如下所示:

addScript('script.js');
addScript('script2.js');
addScript('script3.js');
Run Code Online (Sandbox Code Playgroud)

然后我想到创建一个getHead()内部带有 foreach 循环的函数并返回str_replace那里,但这不起作用。

任何人都可以指导我根据需要动态注入尽可能多的脚本并输出头部的最后一点吗?

gio*_*gio 5

为什么不做这样的事情:

class Assets {
    private static $css = array();
    private static $js = array();

    static function add_style($path) {
        self::$css[] = $path;
    }

    static function add_script($path) {
        self::$js[] = $path;
    }

    static function get_styles() {
        $output = '';
        foreach(self::$css as $path) {
            $ouput .= '<link rel="stylesheet" href="'. $path .'" />' . "\n";
        }
        return $ouput;
    }

    static function get_scripts() {
        $output = '';
        foreach(self::$js as $path) {
            $ouput .= '<script type="text/javascript" src="'. $path .'"></script>' . "\n";
        }
        return $ouput;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的项目中的任何地方:

Assets::add_style('path/to/style.css');
Assets::add_script('path/to/jquery.js');
Run Code Online (Sandbox Code Playgroud)

在 header.php 中:

<head>
    <!-- other header stuff -->
    <?php echo Assets::get_styles(); ?>
    <?php echo Assets::get_scripts(); ?>
</head>
Run Code Online (Sandbox Code Playgroud)

更方便,你可以扩展这个类来做更多花哨的东西。

免责声明:关于使用静态变量存在很多争论,因为它们看起来像全局变量。我同意,但这是快速而肮脏的,无论您使用哪种框架都可以使用。您还可以使变量 oldschool 实例 vars,但是您还必须将资产对象传递给 header.php。