让我说我有一个方法:
public function createFoo(Foo $foo, $isPremiumFoo=false);
事后看来,让$isPremiumFoo
旗帜参数悬而未决是有点傻。所以我们把它移到Foo
,现在我想从方法签名中删除它。但是我不想一下子做到这一切,因为这是一种公共方法,并且在野外被使用。我想@deprecate
它提醒用户他们应该停止使用它然后最终删除它。既然你不能在PHP中重载方法,我怎么能只弃用那个方法参数而不是整个方法呢?
答案 0 :(得分:4)
你可以做这样的事情
class Foo {
}
class Bar {
public function createFoo(Foo $foo, $isPremiumFoo=false) {
if (count(func_get_args()) > 1) {
$warn = "isPremiumFoo is deprecated and will be removed
in a future release";
trigger_error($warn, E_USER_NOTICE);
}
// continue with the implementation
}
}
$foo = new Foo();
$bar = new Bar();
$bar->createFoo($foo); // wont trigger the notice
$bar->createFoo($foo, true); // will trigger the notice
$bar->createFoo($foo, false); // will trigger the notice
答案 1 :(得分:2)
我做过同样的事情。我们在团队中使用的方法只是更新文档块。
然后在IDE中,当有人获得弹出窗口时,他们可以清楚地看到它已被弃用,我们不会使用它。随着时间的推移,我们终于将它们全部删除了。
示例:
/**
* Create Foo
*
* @param Foo Description
* @param bool Deprecated, use Foo->setIsPremium(true|false)
*
* @return Bar
*/
public function createFoo(Foo $foo, $isPremiumFoo=false);
希望这有助于一些人。
答案 2 :(得分:0)
<?php
class Foo
{
private $isPremium = false;
public function setPremium($premium)
{
$this->isPremium = $premium;
}
public function isPremium()
{
return $this->isPremium;
}
}
function createFoo(Foo $foo)
{
if (func_num_args() > 1) {
$isPremium = func_get_args()[1];
$foo->setPremium($isPremium);
}
return $foo;
}
$foo = new Foo();
var_dump(createFoo($foo)); // false (because default value is false in the class)
$foo->setPremium(true);
var_dump(createFoo($foo)); // true (the new way - you can manipulate it as an object property.)
var_dump(createFoo($foo, false)); // false (even thought you have manipulated it, it's backwards compatibility for users who are using the second param)
var_dump(createFoo($foo, true)); // true (again backward compatibility)
解释在代码注释中。基本上,没有什么可以阻止你调用比它收到的更多参数的函数。因此,您可以安全地从签名中删除它并在函数体中检查它。
使用该逻辑,如果提供了第二个参数,您可以向用户显示某种警告。使用新API的新用户可能甚至不知道存在第二个参数。