php要求对象属性为给定类型

时间:2014-09-03 16:33:19

标签: php

是否可以创建一个需要属性为给定类型的类/对象?例如,以下内容将通过异常,警告,错误等进行。

$bla = new bla();
$bla->integer_only="not an integer";

class bla {
  public $array_only;
  public $string_only;
  public $integer_only;
}

3 个答案:

答案 0 :(得分:1)

我们可以验证分配值的数据类型。但是我们不能强制只为变量分配特定的数据类型。

答案 1 :(得分:0)

是的,你可以在函数参数中使用类型提示,只要类型不是标量或在构造函数中使用PHP gettype()方法。这样的事情也有效;

if(is_int($value)){
  // all is good
}

答案 2 :(得分:0)

您可以做的是使用您的私有变量创建一个基类,然后使用公共和/或受保护的setter方法来检查类型并根据需要抛出异常。请考虑以下事项:

<?php

class Foo
{
    private $intValue;
    private $strValue;
    private $arrayValue;

    protected function setInt($int)
    {
        if(is_int($int)) {
            $this->intValue = $int;
        } else {
            throw new InvalidArgumentException;
        }
    }

    protected function setString($str)
    {
        if(is_string($str)) {
            $this->strValue = $str;
        } else {
            throw new InvalidArgumentException;
        }
    }

    protected function setArray(array $arr)
    {
        //No need to check, type hint in method signature will enforce array
        $this->arrayValue = $arr;
    }

    // Be sure to add your getter methods as well!!!!
    // .....
}

class Bar extends Foo
{
    public function setValues($int, $str, $arr)
    {
        $this->setInt($int);
        $this->setString($str);
        $this->setArray($arr);
    }
}

?>

Foo类是父类,并确保只有正确的类型才能将其作为私有变量。 Bar是子节点,可以使用受保护的setter方法,但不能直接分配类型。以下代码:

$bar = new Bar();
$bar->setValues(0, "We the people...", array("banana", "apple", "orange"));
var_dump($bar);

产生

object(Bar)[1]
  private 'intValue' (Foo) => int 0
  private 'strValue' (Foo) => string 'We the people...' (length=16)
  private 'arrayValue' (Foo) => 
    array (size=3)
      0 => string 'banana' (length=6)
      1 => string 'apple' (length=5)
      2 => string 'orange' (length=6)

如果您未提供正确的intstringarray值,您将会收到致命的致命错误或InvalidArgumentException。基本上,如果不遵守规则,这将使您的代码尝试崩溃。