PHP наследование абстрактных классов и перегрузка - PullRequest
0 голосов
/ 10 мая 2019

Скажем, у меня есть следующий код, есть ли способ как-то расширить абстрактный класс для потомка и требовать другой тип аргумента в «перегруженной» функции. Я хочу вставить различные типы объектов в коллекцию через функцию добавления. В некоторых случаях я хотел бы вставить объект 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 голосов
/ 10 мая 2019

Если вы расширяете класс или реализуете интерфейс, подпись должна совпадать. Однако вы можете самостоятельно выполнить проверку типа и ввести подсказку в блоке документации.

В качестве примечания, 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;
    }
}
0 голосов
/ 10 мая 2019

Попробуйте это

    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
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...