向函数传递一个对象,该对象是函数接受的类型的子类的实例

时间:2011-07-15 09:18:25

标签: php oop function parameter-passing

有没有办法让下面的代码有效?

public function my_function(My_Class $arg){  ....   }

public class My_Sub_Class extends My_Class { ...  }

//NOW
$my_object = new My_Sub_Class();

my_function($my_object);

我编辑了一些写错误

3 个答案:

答案 0 :(得分:1)

public class My_Sub_Class extends My_Class() { }

应该是

public class My_Sub_Class extends My_Class { }

另外,我不确定$my_object = new My_Sub_Class(){ .... }应该是什么。 My_Sub_Class不是函数!


修复这些错误,向您的测试用例添加My_Class的定义,并删除public前缀(因为您的示例没有周围的类定义),我最终得到以下内容,{{ 3}}:

<?php
class My_Class {}
class My_Sub_Class extends My_Class {}

function my_function(My_Class $arg){ echo "my_function"; }

$my_object = new My_Sub_Class();
my_function($my_object);
?>

看看works just fine

事实上,如果你无法获得“工作”的东西,请查看手册中你使用的每个功能

答案 1 :(得分:0)

你的代码工作得很好(也就是说,将子类传递给具有超类类型提示的函数)。这是我的代码,已经过验证可以在PHP 5.3.3上运行:

<?php
class Foo {}
class Bar extends Foo {}
function quu(Foo $a) { return $a; }

$foo = new Foo();
$bar = new Bar();

var_dump(quu($foo));
var_dump(quu($bar));

当然,您的第二行和第三行有语法错误。但这与你的问题无关......

答案 2 :(得分:0)

由于子类扩展了父类,因此它必须具有父类的所有属性和方法。因此,您不必担心 - 您的函数也将接收并使用所有子类的对象。 第三行中有错误 - 在初始化对象后,您不需要大括号。