我遇到了一些涉及此问题的线程,但它们都非常具体,因此令人困惑。
一般来说,组合多个功能的最佳做法是什么?我在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)
。
答案 0 :(得分:0)
像这样定义:
function mytheme_preprocess_page(&$variables, $hook = null) {
使hook参数可选,然后可以像这样调用函数:
mytheme_preprocess_page($var);
或mytheme_preprocess_page($var, $another_var)
。
在第一种情况下,$hook
将为null
,而在第二种$hook
中,$another_var
的值为if ($hook === null) {
您可以像这样签入您的函数:{{1}}这两个中的哪一个被称为
答案 1 :(得分:0)
我的回答可能无法帮助您解决您所面临的问题,但我会回答这个问题:
一般来说,组合多个功能的最佳做法是什么?
组合函数的最佳方法是类。这就是他们的目的 - 将处理常见任务的函数(方法)分组并隔离它,以便您可以专注于解决一个常见的任务/问题。
一旦需要更改某个函数,您extend
该类并实现新的函数功能。这使得你可以拥有任意数量的类,这些类包含具有相同名称的函数,但每个类都可以执行不同的操作。
基本上你不能以fatal error: Cannot redeclare...
的方式获得。但是,这是否适用于Drupal或者是否需要完整的程序代码是我不熟悉的。
答案 2 :(得分:0)
但是这里只有一个功能,而不是2个功能。只有第二个参数是可选的。与PHP中的其他一些语言(如Java)不同,您不能拥有2个具有相同名称和不同参数的函数。你不能重载这个功能。
Same named function with multiple arguments in PHP
所以,我想,你只需复制来自"两者的内容"你的函数并将它放在一个函数上并删除其他函数。