PHP继承抽象类和重载

时间:2019-05-10 09:12:29

标签: php class oop inheritance abstract

说我有以下代码,是否有办法以某种方式在子级上扩展抽象类,并在“重载”函数中需要不同类型的参数。我想通过add函数在Collection中插入各种类型的对象。在某些情况下,我想插入一个Error对象,有时要插入其他一些(XYZ)对象,并且可以说所有这些对象都扩展了一个称为Parent的同一个抽象类。

如果有人能告诉我这样的事情是否可行,以及是否建议实现此目的的一些方法,我将不胜感激。请注意,我打算在其中托管应用程序的生产服务器在php 5.6.40上运行。

谢谢。


namespace App;

use App\Models\Parent;

abstract class Collection
{
   protected $collection;

   public function __construct()
   {
       $this->collection = array();
   }

   abstract public function add($key, Parent $item);
}


public class ErrorList extends Collection
{
    public function __construct()
    {
       parent::__construct();
    }

    public function add($key, Error $item)
    {
       $this->collection[$key] = $item;
    }
}






namespace App\Models;

abstract class Parent {}

public class Error extends Parent {}

public class XYZ extends Parent{}

2 个答案:

答案 0 :(得分:0)

尝试一下

    abstract class Collection
    {
       protected $collection;

       public function __construct()
       {
           $this->collection = array();
       }

       //no type hinting
       abstract public function add($key, $item);
    }


    class ErrorList extends Collection
    {

        // this constructor doing nothing , it can be removed  and     
        // parent constructor will still be called unlike java or any other 
        // OOP
        public function __construct()
        {
           parent::__construct();
        }

        //no type hinting
        public function add($key, $item)
        {
           //code
        }
    }

答案 1 :(得分:-1)

如果要扩展类或实现接口,则签名必须匹配。但是,您可以自己进行类型检查,并在文档块中键入提示。

请注意,public class是无效的语法。

abstract class Collection
{
   protected $collection;

   public function __construct()
   {
       $this->collection = array();
   }

   abstract public function add($key, Parent $item);
}


class ErrorList extends Collection
{
    public function __construct()
    {
       parent::__construct();
    }

    /**
     * @param $key
     * @param Parent|Error $item
     */
    public function add($key, Parent $item)
    {
       if (!($item instanceof Error)) {
            throw new \InvalidArgumentException('Unable to add object to error list: ' . get_class($item));
        }
       $this->collection[$key] = $item;
    }
}
相关问题