0

我需要知道我们是否必须检查 PHP OOP 中类方法的输入参数?
例如想象下面的方法:

public function show_message($message)
{
   echo $message;
}

如果程序员不将消息参数传递给方法,最好的解决方案是什么?让 PHP 显示它的警告或运行时错误或做其他事情?

4

4 回答 4

2

最佳”解决方案取决于您希望该方法确切执行的操作,但通常,我建议将类型提示和默认值结合使用:

class Foo
{
    public function doSomething ($message = 'None')
    {
        echo $message;
    }
    public function somethingElse (array $foo = array())
    {
        echo '<pre>';
        print_r($foo);
        echo '</pre>';//will always be an array
    }
    public function onlyMyself (Foo $instance)
    {
        return $instance->doSomething('I know this method exists');
    }
    public function myselfOrNothing(Foo $instance = null)
    {
        if ($instance === null)
        {
            return $this->doSomething('No instance provided');
        }
        return $instance->doSomething('Instance provided to '.__METHOD__);
    }
}
$foo = new Foo;
$bar = new Bar;
$foo->onlyMyself($bar);//works fine
$foo->onlyMyself(array());//fails
$bar->myselfOrNothing();//works
$bar->somethingElse();//ok...

等等,你得到了基本原理。
请注意,如果您使用的是抽象父类(或任何旧的父类),则类型提示父类也允许传递子类:

class Bar extends Foo
{
}
class Foobar extends Bar
{
}
$fb = new Foobar;
$b = new Bar;
public function someClass(Foo $instance)
{//accepts instances of Foo, Bar and Foobar...
    echo get_class($instance);//can echo any class name
}
于 2013-02-23T09:21:20.420 回答
1

允许默认值,然后捕获该默认值。这使您可以控制您的操作,而不是简单的默认 PHP 行为

public function show_message($message = "\x00")
{
    if ($message === "\x00") {
        // decide how critical this argument actually is, and react appropriately
        throw new BadMethodCallException("The message argument is critical and must be passed to this method");
        // or simply apply a default if it isn't critical
        $message = 'Hello World';
    }
    echo $message;
}
于 2013-02-23T09:20:22.960 回答
0

我认为错误的类型应该取决于函数的重要性,以及如果参数不存在,这是否足以成为停止执行的理由。

于 2013-02-23T09:11:40.467 回答
0

如果您正在谈论输入参数验证。你可以做这样的事情。

public function show_message($message = '') {

  $result = 'No message';

  if (!empty($message)) {

    if (is_bool($message)) {
      $result = 'It is a boolean';
    }
    if (is_int($message)) {
      $result = 'It is a integer';
    }
    if (is_float($message)) {
      $result = 'It is a float';
    }
    if (is_string($message)) {
      $result = 'It is a string';
    }
    if (is_array($message)) {
      $result = 'It is an array';
    }
    if (is_object($message)) {
      $result = 'It is an object';
    }
  }

  return $result;
}
于 2013-02-23T09:21:39.030 回答