是否有可能在PHP中弃用方法参数?

时间:2014-11-18 22:19:16

标签: php

让我说我有一个方法:

public function createFoo(Foo $foo, $isPremiumFoo=false);

事后看来,让$isPremiumFoo旗帜参数悬而未决是有点傻。所以我们把它移到Foo,现在我想从方法签名中删除它。但是我不想一下子做到这一切,因为这是一种公共方法,并且在野外被使用。我想@deprecate它提醒用户他们应该停止使用它然后最终删除它。既然你不能在PHP中重载方法,我怎么能只弃用那个方法参数而不是整个方法呢?

3 个答案:

答案 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的新用户可能甚至不知道存在第二个参数。