PHP 面向对象基础:参数类型约束
PHP 5
可以使用类型约束。函数的参数可以指定必须为对象(在函数原型里面指定类的名字)。如果一个类或接口指定了类型约束,则其所有的子类或实现也都如此。
class Parents {}
实现 Parents
类
class Son extends Parents
{
public function read()
{
echo 'Son is reading.' . '<br />';
}
public function write()
{
echo 'Son is writing.' . '<br />';
}
}
class Daugthter extends Parents
{
public function read()
{
echo 'Daugthter is reading.' . '<br />';
}
public function write()
{
echo 'Daugthter is writing.' . '<br />';
}
}
类型约束示例
class Doing
{
/**
* Son 对象约束
* @param Son $son
*/
public function sonRead(Son $son)
{
$son->read();
}
/**
* Daughter 对象约束
* @param Daugthter $daugthter
*/
public function daugtherRead(Daugthter $daugthter)
{
$daugthter->read();
}
/**
* Parents 对象约束
* @param Parents $parents
*/
public function parentsWrite(Parents $parents)
{
$parents->write();
}
}
$doing = new Doing();
$doing->sonRead(new Son()); // Son is reading.
$doing->daugtherRead(new Daugthter()); // Daugthter is reading.
$doing->parentsWrite(new Son()); // Son is writing.
$doing->parentsWrite(new Daugthter()); // Daugthter is writing.
类型约束也能使用在函数里
function doing (Son $son)
{
$son->read();
}
doing(new Son()); // Son is reading.
类型约束允许 null
值
function test(Son $obj = null) {
echo 'Nothing here.' . '<br />';
}
test(null); // Nothing here.
函数调用的参数与定义的参数类型不一致时会抛出致命错误
// Fatal error: Uncaught TypeError: Argument 1 passed to Doing::sonRead() must be an instance of Son, instance of Daugthter given
$doing->sonRead(new Daugthter());