【问题标题】:pass to a function an object which is an instance of a subclass of the type accepted by the function [closed]将对象传递给函数,该对象是函数接受的类型的子类的实例[关闭]
【发布时间】:2011-10-06 00:09:35
【问题描述】:

有没有办法让下面的代码工作?

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);

我已经编辑了一些写入错误

【问题讨论】:

  • 请澄清问题。你有什么问题?
  • 好吧,如果它“不起作用”,那么我们无法从代码中判断它应该做什么。因为代码“不起作用”,所以它被破坏了,这意味着它实际上不代表你想要做的事情。所以我们不知道你想做什么。

标签: php oop function parameter-passing


【解决方案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 前缀(因为您的示例没有周围的类定义),我最终得到以下works just fine

<?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);
?>

看看the extends keyword in the PHP manual

事实上,看看手册中你使用的每一个功能,如果你不能让某些东西“工作”。

【讨论】:

    【解决方案2】:

    您的代码工作得很好(也就是说,将子类传递给具有超类类型提示的函数)。这是我的代码,经过验证可以在 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));
    

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

    【讨论】:

    • 这不是他的代码。语法错误与他的问题有关。这就是他的代码“不起作用”的原因。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多