Coder1 的建议非常好 - 它可以防止您使用大量垃圾填充全局变量命名空间。这可能是最“优雅”的。如果您是 PHP 新手,它可能不是最容易使用的(我猜,如果您很难理解返回数组,可能会出现这种情况,但没关系)。
但是,如果这真的是一个优先事项,您可能并不关心有一个额外的全局变量。
我想我可能会在这里说明显而易见的事情 - 但您几乎可以在执行的任何时候(假设您需要的信息已经生成 - 例如,已填充 $user 变量),执行以下操作:
$GLOBALS['users_friends_ids'] = /* your code goes here */
然后在您的模板中,您可以通过...访问它
$friendsArray = $GLOBALS['users_friends_ids'];
或者你可以简单地使用构造
global $user_friends_ids;
当你想初始化变量,或者在函数或类中访问它时(你的模板文件就是这种情况——它们在函数内部被调用,所以你需要全球化或使用$GLOBALS数组,即“自动”所有在全局命名空间中活动的变量)。
执行此操作最“合乎逻辑”的地方是在模块内使用许多可用的钩子之一,仅执行此代码一次。 hook_init() 可能会为您执行此操作,如果此时已加载用户对象(不确定,您必须进行测试)。但是您可能不想弄清楚如何制作 Drupal 模块(这并不难)。
如果您在模板中执行此操作(尽管这不是一个好的做法,许多对 PHP 有初步了解的 Drupal 站点所有者将所有内容都放在模板中),您会想知道何时执行哪个模板代码。节点模板代码往往在页面模板代码之前执行 - 这是合乎逻辑的,否则页面模板中节点内容的变量将不会被填充。
如果您有节点列表,它们会多次调用此代码,因此您最终会执行类似于 Coder1 所描述的操作。如果你不想创建自己的小模块,你可以把他写的函数声明放在你主题的 template.php 文件中,因为它只被调用一次。您不想将函数声明放在 tpl.php 文件中,因为它们有时会被多次调用(并且您不能多次声明函数)。
如果你很难理解函数和返回,你总是可以在你的代码中做这样的事情(这非常、非常不优雅——但最好有你理解的不优雅的代码,而不是优雅的代码你没有)。
if(!isset($GLOBALS['users_friends_ids'])) {
$GLOBALS['users_friends_ids'] = /* your code here */
}