组合多个 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" 您的函数中复制内容并将其放在一个函数上,然后删除另一个函数。
我遇到了一些处理此问题的线程,但它们都非常具体,因此令人困惑。
一般来说,组合多个函数的最佳做法是什么?我在 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" 您的函数中复制内容并将其放在一个函数上,然后删除另一个函数。