是否可以创建一个需要属性为给定类型的类/对象?例如,以下内容将通过异常,警告,错误等进行。
$bla = new bla();
$bla->integer_only="not an integer";
class bla {
public $array_only;
public $string_only;
public $integer_only;
}
答案 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)
如果您未提供正确的int
,string
或array
值,您将会收到致命的致命错误或InvalidArgumentException
。基本上,如果不遵守规则,这将使您的代码尝试崩溃。