18

I have a function that takes a member of a particular class:

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

I'd like to make another function that takes an array of My_Page objects:

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

I need to ensure that each element of $pages array is an instance of My_Page. I could do that with foreach($pages as $page) and check for instance of, but can I somehow specify in the function definition that the array has to be an array of My_Page objects? Improvising, something like:

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

Thanks!

6 Answers 6

20

No, it's not possible to do directly. You might try this "clever" trick instead:

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

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

But I 'm not sure if it's worth all the trouble. It would be a good approach if addPage is useful on its own.

18

You can also add PhpDoc comment to get autocomplete in IDE

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

From php5.6 you can use splat operator to type hint all array elements as function params. In this case you don't have more parameters than Pages stored in array so it should work fine:

public function addPages(Page ...$pages)

More info: https://www.php.net/manual/en/migration56.new-features.php

https://lornajane.net/posts/2014/php-5-6-and-the-splat-operator

2

Instead of passing an array of objects (array(My_Page)), define your own class and require an instance of it in your function:

class MyPages { ... }

public function addPages(MyPages pages)
3
  • and how exactly I'm able to store an indefinite amount of specific objects in that class? Commented Mar 13, 2023 at 12:55
  • @goose I have no idea what I meant with this answer back then, sorry. This answer looks pretty useless to me Commented Mar 14, 2023 at 3:31
  • xd it's kk. but it's weird that 2 dudes upvoted it and found this useful Commented Mar 14, 2023 at 13:58
0

if you use the class, you can do some thing like this:

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
   }
}
1
  • 3
    Give proper explanation with your answer with proper reasoning. Commented Dec 28, 2018 at 11:26
-1
<?php
        
    class Page{
            public $a;
    }
        
    
    function addPages(Page ...$pages){
        foreach($pages as $page){
        
        }
    }
        
        
    $pages = [];
    $pages[]  = new Page;
    $pages[]  = new Page;
    $pages[]  = new Page;
    addPages(...$pages);
    
?>

i think its better way

3
  • 1
    Explain why do you think this is a better way please. Commented May 20, 2021 at 6:38
  • This will throw an error: Argument #1 must be type of Page, array given. Commented Sep 30, 2021 at 9:22
  • Its not throwing any error after version 7.0 its working successfuly Commented Nov 8, 2022 at 13:57

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.