我有一个函数,它接受一个特定类的成员:
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...
谢谢!
答案 0 :(得分:12)
不,不可能直接做。你可以试试这个“聪明”的技巧:
public function addPages(array $pages)
{
foreach($pages as $page) addPage($page);
}
public function addPage(My_Page $page)
{
//
}
但我不确定这是否值得所有麻烦。如果addPage
本身很有用,那将是一个很好的方法。
答案 1 :(得分:1)
不是传递对象数组(array(My_Page)
),而是定义自己的类并在函数中需要它的实例:
class MyPages { ... }
public function addPages(MyPages pages)
答案 2 :(得分:1)
您还可以添加PhpDoc注释以在IDE中自动完成
/**
* @param My_Page[] $pages
*/
public function addPages(array $pages)
{
// ...
}
答案 3 :(得分:1)
从 php5.6 开始,您可以使用 splat 运算符 将所有数组元素输入为函数参数。在这种情况下,您没有比存储在数组中的 Pages 更多的参数,因此它应该可以正常工作:
public function addPages(Page ...$pages)
更多信息: https://www.php.net/manual/en/migration56.new-features.php
https://lornajane.net/posts/2014/php-5-6-and-the-splat-operator
答案 4 :(得分:0)
如果您使用该类,则可以执行以下操作:
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
}
}
答案 5 :(得分:0)
<?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);
?>
我认为这是更好的方法