组合多个 PHP 函数

Combining multiple PHP functions

我遇到了一些处理此问题的线程,但它们都非常具体,因此令人困惑。

一般来说,组合多个函数的最佳做法是什么?我在 Drupal 安装的 template.php 文件中使用它来进行主题化。

假设我有两个函数:

function mytheme_preprocess_page(&$variables){
    (...)
}

function mytheme_preprocess_page(&$vars, $hook){
    (...)
}

当我在我的 template.php 中使用这两个函数时,我收到了 致命错误:无法重新声明 mytheme_preprocess_page()(之前在(文件).

完整代码如下:

function mytheme_preprocess_page(&$variables){

    // Add information about the number of sidebars.
    if (!empty($variables['page']['sidebar_first']) && !empty($variables['page']['sidebar_second'])) {
        $variables['content_column_class'] = ' class="col-sm-6 main-content"';
    } elseif (!empty($variables['page']['sidebar_first']) || !empty($variables['page']['sidebar_second'])) {
        $variables['content_column_class'] = ' class="col-sm-9 main-content"';
    } else {
        $variables['content_column_class'] = ' class="col-sm-12 main-content"';
    }
}


function mytheme_preprocess_page(&$vars, $hook){
    if (isset($vars['node'])) {
        switch ($vars['node']->type) {
            case 'article':
                $vars['title'] = '';
                break;
        }
    }
}

我明白我应该合并这些函数。问题是:如何?

因为这些 (&$variables)(&$vars, $hook) 似乎对于每个单独的部分都是必需的。

这样定义:

function mytheme_preprocess_page(&$variables, $hook = null) {

使钩子参数可选,然后你可以像这样调用函数:

mytheme_preprocess_page($var);mytheme_preprocess_page($var, $another_var).

在第一种情况下 $hook 将是 null,在第二种情况下 $hook 将具有 $another_var

的值

您可以像这样签入您的函数:if ($hook === null) {调用两者中的哪一个

我的回答可能无法帮助您解决您面临的问题,但我会回答问题:

What's the best practice to combine multiple functions in general?

组合函数的最佳方式是class。这就是他们的目的 - 将处理共同任务的功能(方法)分组并将其隔离,以便您可以专注于解决一个共同任务/问题。

一旦需要更改函数,您 extend class 并实现新的函数功能。这让您可以拥有任意数量的 classes,其中包含具有相同名称的函数,但每个函数可以做不同的事情。

基本上你不能那样fatal error: Cannot redeclare...。但是,这是否适用于 Drupal 或者它是否需要完整的过程代码是我不熟悉的。

但是这里你只有一个功能,而不是两个功能。只有第二个参数是可选的。与 PHP 中的某些其他语言(例如 Java)不同,您不能有 2 个具有相同名称和不同参数的函数。您不能重载函数。

Same named function with multiple arguments in PHP

所以,我想,您只需从 "both" 您的函数中复制内容并将其放在一个函数上,然后删除另一个函数。