【问题标题】:Must declaration of the child class method be compatible with parent class method in PHP?子类方法的声明必须与 PHP 中的父类方法兼容吗?
【发布时间】:2016-06-11 05:08:38
【问题描述】:

这段代码运行良好。

ParentClass 是抽象类。我想我可以通过

来验证
$class = new ReflectionClass('ParentClass');
$methods = $class->getMethods(ReflectionMethod::IS_ABSTRACT);

其中显示了几个方法,其中一个名为 methodA

真正让我困惑的是:

有一个ChildClass,它是一个具体的类,并实现了一个抽象方法methodA。使用

$method = new ReflectionMethod('ChildClass', 'methodA');
var_dump($method->getParameters());

我可以验证有 3 个参数。因为我知道代码运行良好。我使用相同的 ReflectionMethod 来验证ParentClass

$method = new ReflectionMethod('ParentClass', 'methodA');
var_dump($method->getParameters());

我想这会输出一个空数组,表示没有参数。

为什么?可悲的是,我无法查看这些类的源代码,但我一直在尝试弄清楚这一点,但没有取得太大进展:

到目前为止,我只能做这样的事情。代码在 PHP5.4 中。我真的不知道如何制作一个没有参数的抽象方法_myFunction,而是制作带有 3 个参数的具体子类方法。 PHP 使用__call 来重载,但我想这更像是extending 问题。

class A {}

abstract class MyAbstractClass
{   
    //abstract public function _myFunction();// ERROR
    abstract public function _myFunction(A $a, A $b, A $c);
}

class Foobar extends MyAbstractClass
{   
    public function _myFunction(A $a, A $b, A $c = null)
    {   
        echo "abc";
    }
}

$a = new Foobar();
$a->_myFunction(new A(), new A(), new A());
$a->_myFunction(new A(), new A());

//output: abcabc without error

添加:

写下问题后,它有助于我进一步测试,我想我现在知道为什么了。子方法已为所有 3 个参数赋予了默认值。

class Foobar extends MyAbstractClass
{   
    public function _myFunction(A $a = null, A $b = null, A $c = null)
    {
        echo "abc";
    }
}

这会起作用。

【问题讨论】:

    标签: php abstract-class overloading extend


    【解决方案1】:

    根据PHP manual

    从抽象类继承时,所有在父类声明中标记为抽象的方法都必须由子类定义;此外,这些方法必须定义为具有相同(或限制较少)的可见性。

    此外,方法的签名必须匹配,即类型提示和所需参数的数量必须相同。

    所以,父类有 0 个参数,子类有 2 个必需。那就是问题所在。但是既然你改变了你的代码,正如你所说:

    子方法已经给所有 3 个参数一个默认值。

    您将子类中所需参数的数量减少到 0。所以它现在可以工作了。

    重述。 这是错误的:

    abstract class MyAbstractClass
    {   
        abstract public function _myFunction(); // No parameters required
    }
    
    class Foobar extends MyAbstractClass
    {   
        public function _myFunction(A $a, A $b, A $c = null) // Two parameters required
        {   
            echo "abc";
        }
    }
    

    这也是错误的:

    abstract class MyAbstractClass
    {   
        abstract public function _myFunction(A $a, A $b, A $c); // Three parameters required
    }
    
    class Foobar extends MyAbstractClass
    {   
        public function _myFunction(A $a, A $b) // Two parameters required
        {   
            echo "abc";
        }
    }
    

    没关系:

    abstract class MyAbstractClass
    {   
        abstract public function _myFunction(); // No parameters required
    }
    
    class Foobar extends MyAbstractClass
    {   
        public function _myFunction(A $a = null, A $b = null, A $c = null) // No parameters required
        {   
            echo "abc";
        }
    }
    

    这也没关系:

    abstract class MyAbstractClass
    {   
        abstract public function _myFunction(A $a, A $b, A $c);
    }
    
    class Foobar extends MyAbstractClass
    {   
        public function _myFunction(A $a, A $b, A $c = null)
        {   
            echo "abc";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多