我最近在和一些人谈论我正在编写的程序时听到了“hook”这个词。我不确定这个术语到底意味着什么,尽管我从对话中推断钩子是一种函数类型。我寻找一个定义,但无法找到一个好的答案。有没有人能告诉我这个术语的一般含义,或者举个小例子来说明这个定义?
当前回答
在一般意义上,“钩子”是让程序员查看和/或与/或改变系统/程序中已经发生的事情的东西。
例如,Drupal CMS为开发人员提供了钩子,允许他们在创建“内容节点”之后采取额外的操作。如果开发人员没有实现钩子,则按常规创建节点。如果开发人员实现了钩子,他们可以在创建节点时运行一些额外的代码。这段代码可以做任何事情,包括回滚和/或更改原始操作。它还可以做一些与节点创建完全无关的事情。
回调可以被认为是一种特定类型的钩子。通过在系统中实现回调功能,该系统允许您在操作完成后调用一些额外的代码。然而,钩子(作为一个通用术语)并不局限于回调。
另一个例子。有时Web开发人员会将元素上的类名和/或id称为钩子。这是因为通过在元素上放置ID/类名,他们可以使用Javascript修改该元素,或“钩入”到页面文档。(这是一个延伸的意思,但它是常用的,值得一提)
其他回答
通常挂钩指的是Win32消息挂钩或Linux/OSX的等等物,但更一般的挂钩只是通知另一个对象/窗口/程序等,当指定的操作发生时,你想被通知。例如:让系统上的所有窗口在即将关闭时通知您。
作为一般规则,钩子有点危险,因为在不了解它如何影响系统的情况下这样做可能会导致不稳定或至少是意想不到的行为。在某些情况下,它也非常有用。例如:FRAPS使用它来确定应该在哪个窗口显示FPS计数器。
一个函数,允许您提供另一个函数,而不仅仅是一个值作为参数,本质上是扩展它。
在Drupal内容管理系统中,“hook”有一个相对特定的含义。当内部事件发生时(例如内容创建或用户登录),模块可以通过实现一个特殊的“钩子”函数来响应该事件。这是通过命名约定完成的——例如,用户登录事件的[your-plugin-name]_user_login()。
由于这种惯例,底层事件被称为“钩子”,并在Drupal的API文档中以“hook_user_login”和“hook_user_authenticate()”这样的名称出现。
钩子是一类允许基本代码调用扩展代码的函数。这在核心开发人员希望在不暴露代码的情况下提供可扩展性的情况下非常有用。
钩子的一个用法是在电子游戏mod开发中。游戏可能不允许mod开发者扩展基本功能,但核心mod库开发者可以添加钩子。有了这些钩子,独立开发者可以在任何想要的事件中调用他们的自定义代码,比如游戏加载、库存更新、实体交互等。
一种常见的实现方法是给函数一个空的回调列表,然后公开扩展回调列表的能力。基本代码将始终在相同的适当时间调用该函数,但如果是空回调列表,则该函数不执行任何操作。这是有意为之。
然后,第三方就有机会编写额外的代码,并将他们的新回调添加到钩子的回调列表中。仅仅通过一个可用钩子的引用,它们就以最小的风险扩展了基本系统的功能。
hook不允许开发人员做任何其他结构和接口不能做的事情。它们是需要考虑任务和用户(第三方开发人员)的选择。
澄清一下:钩子允许扩展,并且可以使用回调来实现。回调函数通常只是一个函数指针;函数的计算地址。其他答案/评论似乎有些混乱。
从本质上讲,它是代码中的一个地方,允许您进入一个模块来提供不同的行为或在发生某事时做出反应。