我在插件中使用的功能之一是使用可能与另一个功能(在另一个插件中使用)相冲突的名称来污染全局范围。所以,我想我应该弃用它。但是我该怎么做呢?

function foo() {
    echo 'bar';
}


我知道_deprecate_function(),但是请提供一个示例,说明我应该采取的所有步骤以删除该组件。我插件的核心功能。

参考:https://developer.wordpress.org/reference/functions/_deprecated_function/

评论

很好的问题,但是也许是时候为您的插件命名空间了吗?您仍然可以从已弃用的函数中调用新的名称空间...

Namespacing是我想探索的一个选项,但是还不确定是否要放弃对PHP 5.2的支持。

如果php版本太低,则加载不推荐使用的替代方法,但使用namepacing可能会给您一个过渡路径。然后,您已弃用的消息可能是“您的托管服务提供商不支持PHP 5.3+等等等”

#1 楼

除了@Welcher的回答:

核心中还有一些很好的“ graveyard”示例,其中“功能消失了”。

您可以将它们用作准则,例如有关文档。

下面是permalink_link()wp-includes/deprecated.php的一个示例

/**
 * Print the permalink of the current post in the loop.
 *
 * @since 0.71
 * @deprecated 1.2.0 Use the_permalink()
 * @see the_permalink()
 */
function permalink_link() {
        _deprecated_function( __FUNCTION__, '1.2', 'the_permalink()' );
        the_permalink();
}


这里是_deprecated_function函数的内联文档,解释了输入参数:

/**
 * Mark a function as deprecated and inform when it has been used.
 *
 * There is a hook deprecated_function_run that will be called that can be used
 * to get the backtrace up to what file and function called the deprecated
 * function.
 *
 * The current behavior is to trigger a user error if WP_DEBUG is true.
 *
 * This function is to be used in every function that is deprecated.
 *
 * @since 2.5.0
 * @access private
 *
 * @param string $function    The function that was called.
 * @param string $version     The version of WordPress that deprecated the function.
 * @param string $replacement Optional. The function that should have been called. 
 *                            Default null.
 */


评论


谢谢你我没想到要看核心采用的方法!所以我假设这些是我需要采取的步骤? 1)从函数中删除所有原始内容2)添加对_deprecated_function()的调用3)添加对我的新函数的调用,该函数取代了旧函数

– henrywright
15年12月22日在14:28

这听起来像是这里讨论的两个问题-过时和可能的名称冲突。我仅根据问题的标题在这里解决了第一部分。

– birgire
2015年12月22日14:43



@MarkKaplun我同意有2个问题正在进行。问题是如何弃用该函数,这就是我的答案所基于的。 __doing_it_wrong通知适用于在主题等中调用此方法的开发人员,以使他们能够对API中的更改做出反应,而不仅仅是对网站进行白屏处理。 Log Deprecated Notices是一个很棒的dev插件,它使您可以了解核心更改的最新信息,在这种情况下也将有所帮助。

–Welcher
15年12月22日在18:24

@MarkKaplun我明白你的意思了。但是,我认为不赞成使用的部分是保持向后兼容性,直到将该项目从API中删除为止。通知的重点(无论使用哪种方法生成通知)都是要通知使用该方法的开发人员将其删除,并给予他们相应的时间采取行动。不赞成使用的方法是突出显示并删除它,正确的方法是首先让用户注意:)

–Welcher
15年12月22日在20:26

@MarkKaplun我不确定您要反对的是什么(还是为了什么?)。问题是如何弃用一种方法,OP指出“我的插件”知道弃用意味着他是一名开发人员,这很明显。您所讨论的虚构用户与该特定问题无关。如果您担心在日志中收到一百万条通知,则仅在启用WP_DEBUG的情况下才会输出有问题的方法,并且您要指出的是,非开发人员不会启用,当然也不会在生产中启用。我要恭喜,只是同意不同意:)

–Welcher
15年12月22日在21:11

#2 楼

弃用并不总是等同于被删除,这通常意味着该项目已标记为可从API进行有效删除。这是一种可以在外部调用的方法吗?如其他插件或开发人员所使用的那样?如果此方法仅由插件内部使用,则可以安全地删除它,并使用更好的名称函数替换。

如果不行,我将创建更好命名的函数并使用名称错误的函数通过__doing_it_wrong调用对其进行调用-在法典中对其进行阅读,这将使其他开发人员有时间更新其对该方法的引用,并且可以在以后的版本中安全地删除该方法。

function badly_named() {

    __doing_it_wrong( 'badly_named', 'This method has been deprecated in favor of better_named_function' );

    /**
     * Call the better named method
     */
     better_named_function();
}


希望这会有所帮助!

评论


谢谢你,但是我想我应该复制它的核心功能。以@birgire的答案为例

– henrywright
15年12月22日在18:49

听起来不错 :)

–Welcher
2015年12月22日19:08



#3 楼

我建议使用以下内容:

/**
 * @deprecated Please use good_function_name() instead
 * @since x.y.z Marked deprecated in favor of good_function_name()
 * @see good_function_name()
 */
function bad_function_name() {
    trigger_error(
        'The ' . __FUNCTION__ . ' function is deprecated. ' .
        'Please use good_function_name() instead.',
        defined( 'E_USER_DEPRECATED' ) ? E_USER_DEPRECATED : E_USER_WARNING
    );

    return good_function_name();
}


这样的效果是在日志中显示弃用警告以及堆栈跟踪。自然,这只有在WordPress中启用日志记录后才能起作用。

三元运算符在那里,因为E_USER_DEPRECATED常量仅在PHP 5.3.0中引入。在旧版本中,我们可以转而使用简单的用户警告。

来自PHP手册的错误常量:


E_DEPRECATED运行时通知。启用此功能可接收有关在以后的版本中将不起作用的代码的警告。


我不喜欢使用_doing_it_wrong或__deprecated_function的原因是这些功能仅用于WordPress核心。从这些功能的代码参考中:


该功能的访问被标记为私有。这意味着它不打算由插件或主题开发人员使用,只能在其他核心功能中使用。为了完整起见,在此列出。


评论


+1是完全有效的点-尽管我们可以看到Woocommerce之类的插件同时使用了这两个功能。而不管。

– birgire
17年7月6日在10:09



#4 楼

您创建了一个新插件,并建议您的用户将其迁移为当前的EOL。

没有什么比插件和主题作者更改其公共API并尝试将其视为“只是另一个小升级”。由于您的用户实际上不受其影响,因此没有理由中断站点。

评论


如果另一个插件具有完全相同名称的功能(并且未使用名称空间),则我的用户将受到此影响。

– henrywright
2015年12月22日14:16

否,插件激活将失败,他们将向您或其他插件的作者投诉。总中断时间约为零。如果他们确实需要两个插件都升级到一个新插件,则只需不超过15分钟,而且不会影响网站的正常运行。您想要的是一些用户将升级,并且发现某些功能不再起作用而没有任何通知。该修理了吗?您认为他们完全有备份并且可以修复该备份吗?

–马克·卡普伦
2015年12月22日14:29在

创建API后,您必须永久或至少一直支持它,直到完全不相关为止。例如,wordpress从3.4开始就并未删除任何已弃用的API,仅添加通知对您没有任何好处。

–马克·卡普伦
15年12月22日在14:30

+1是因为我尊重您的意见,而我对本网站的欣赏是对问题的不同看法,方法和解决方案,因为通常没有一个适合所有人的大小。

– birgire
2015年12月23日在9:59