我最近在和一些人谈论我正在编写的程序时听到了“hook”这个词。我不确定这个术语到底意味着什么,尽管我从对话中推断钩子是一种函数类型。我寻找一个定义,但无法找到一个好的答案。有没有人能告诉我这个术语的一般含义,或者举个小例子来说明这个定义?
当前回答
当遇到某些条件时,可以执行钩子。例如,一些变量发生了变化,或者调用了一些动作,或者发生了一些事件。hook可以进入过程并更改内容或对更改作出反应。
其他回答
在一般意义上,“钩子”是让程序员查看和/或与/或改变系统/程序中已经发生的事情的东西。
例如,Drupal CMS为开发人员提供了钩子,允许他们在创建“内容节点”之后采取额外的操作。如果开发人员没有实现钩子,则按常规创建节点。如果开发人员实现了钩子,他们可以在创建节点时运行一些额外的代码。这段代码可以做任何事情,包括回滚和/或更改原始操作。它还可以做一些与节点创建完全无关的事情。
回调可以被认为是一种特定类型的钩子。通过在系统中实现回调功能,该系统允许您在操作完成后调用一些额外的代码。然而,钩子(作为一个通用术语)并不局限于回调。
另一个例子。有时Web开发人员会将元素上的类名和/或id称为钩子。这是因为通过在元素上放置ID/类名,他们可以使用Javascript修改该元素,或“钩入”到页面文档。(这是一个延伸的意思,但它是常用的,值得一提)
钩子是一类允许基本代码调用扩展代码的函数。这在核心开发人员希望在不暴露代码的情况下提供可扩展性的情况下非常有用。
钩子的一个用法是在电子游戏mod开发中。游戏可能不允许mod开发者扩展基本功能,但核心mod库开发者可以添加钩子。有了这些钩子,独立开发者可以在任何想要的事件中调用他们的自定义代码,比如游戏加载、库存更新、实体交互等。
一种常见的实现方法是给函数一个空的回调列表,然后公开扩展回调列表的能力。基本代码将始终在相同的适当时间调用该函数,但如果是空回调列表,则该函数不执行任何操作。这是有意为之。
然后,第三方就有机会编写额外的代码,并将他们的新回调添加到钩子的回调列表中。仅仅通过一个可用钩子的引用,它们就以最小的风险扩展了基本系统的功能。
hook不允许开发人员做任何其他结构和接口不能做的事情。它们是需要考虑任务和用户(第三方开发人员)的选择。
澄清一下:钩子允许扩展,并且可以使用回调来实现。回调函数通常只是一个函数指针;函数的计算地址。其他答案/评论似乎有些混乱。
从本质上讲,它是代码中的一个地方,允许您进入一个模块来提供不同的行为或在发生某事时做出反应。
编程中的钩子是一种技术,它使用所谓的钩子来创建一个过程链作为事件处理程序。
A chain of hooks is a set of functions in which each function calls the next. What is significant about a chain of hooks is that a programmer can add another function to the chain at run time. One way to do this is to look for a known location where the address of the first function in a chain is kept. You then save the value of that function pointer and overwrite the value at the initial address with the address of the function you wish to insert into the hook chain. The function then gets called, does its business and calls the next function in the chain (unless you decide otherwise). Naturally, there are a number of other ways to create a chain of hooks, from writing directly to memory to using the metaprogramming facilities of languages like Ruby or Python.
钩子链的一个例子是MS Windows应用程序处理消息的方式。处理链中的每个函数要么处理消息,要么将其发送给链中的下一个函数。