Аргументы функции PHP: массив объектов определенного класса

У меня есть функция, которая принимает член определенного класса:

public function addPage(My_Page $page)
{
  // ...
}

Я хотел бы сделать еще одну функцию, которая принимает массив объектов My_Page:

public function addPages($pages)
{
  // ...
}

Мне нужно убедиться, что каждый элемент массива $pages является экземпляром My_Page. Я мог бы сделать это с помощью foreach($pages as $page) и проверить instance of, но могу ли я как-то указать в определении функции, что массив должен быть массивом объектов My_Page? Импровизация, что-то вроде:

public function addPages(array(My_Page)) // I realize this is improper PHP...

Спасибо!

Ответ 1

Нет, это невозможно сделать напрямую. Вместо этого вы можете попробовать этот "умный" трюк:

public function addPages(array $pages)
{
    foreach($pages as $page) addPage($page);
}

public function addPage(My_Page $page)
{
    //
}

Но я не уверен, что это стоит всех проблем. Это был бы хороший подход, если addPage полезен сам по себе.

Ответ 2

Вместо передачи массива объектов (array(My_Page)) определите свой собственный класс и потребуйте его экземпляр в своей функции:

class MyPages { ... }

public function addPages(MyPages pages)

Ответ 3

если вы используете класс, вы можете сделать что-то вроде этого:

interface addPageInterface
{
   public function someThing();
}


class page implements addPageInterface
{
   public function someThing()
   {
      //for example: create a page
   }
}


class addPage
{
   public function __construct(addPageInterface $page)
   {
       //do some thing...

      return $page; //this will return just one page
   }
}


class addPages
{
   public function __construct(addPageInterface... $page)
   {
      //do some thing...

      return $page; //this will return an array which contains of page
   }
}

Ответ 4

Вы также можете добавить комментарий PhpDoc, чтобы получить автозаполнение в IDE

    /**
     * @param My_Page[] $pages
     */
    public function addPages(array $pages)
    {
      // ...
    }