我需要帮助理解对象的类型提示。我尝试搜索stackoverflow但找不到任何其他用户解释其使用的东西。如果你找到一个让我知道。 首先让我解释一下我的理解。
当使用数组类型提示时,用户必须输入一个数组参数,否则会引发错误。
<?php
function something(array $myval)
{
return print_r($myval);
}
当我尝试使用对象时,我收到错误。我可能写错了,但请帮助我理解如何写它。
<?php
class Person
{
function name($name)
{
return $name;
}
}
$foo = new Person();
function doSomething(Person $lname)
{
return $lname->name;
}
doSomething('smith');
根据我的理解,当一个函数类型暗示了对象Person(在这个例子中)时,参数变量将能够访问对象方法,就像实例化一个对象并回显其方法一样。我错了,但请纠正我。我的另一个问题是,如果Person参数可以访问Person方法,那么这与只是实例化Person类并手动回显方法有什么不同。
答案 0 :(得分:12)
使用您的示例:
$foo = new Person;
$foo->name = 'smith';
$something = doSomething($foo);
echo $something;
类型提示意味着你传递的任何内容都必须是你暗示的类型(与你的类型相同)的实例。
因此,如果您提示Person
,则只接受该类型的对象。
在您给出的示例中,您尝试传递字符串而不是对象。
<强>更新强>
“类型提示”强制您仅传递特定类型的对象。这可以防止您传递不兼容的值,并在您与团队等合作时创建标准。
所以,假设你有一个函数sing()
。您希望确保它只接受Song
类型的对象。
让我们创建我们的课程Song
:
class Song{
public $title;
public $lyrics;
}
和我们的功能唱歌()。我们将提示键入Song
以确保不能传递其他类型的参数:
function sing(Song $song){
echo "Singing the song called " .$song->title;
echo "<p>" . $song->lyrics . "</p>";
}
现在,该函数再次只能接受Song
类型的对象,因为这是我们在声明中所暗示的内容(Song $song
)。
让我们创建一首歌并传递它:
$hit = new Song;
$hit->title = "Beat it!";
$hit->lyrics = "It doesn't matter who's wrong or right... just beat it!";
然后我们打电话:
sing($hit);
哪种方法可以正常使用。
现在,假设我们有一个班级Poem
:
class Poem{
public $title;
public $lyrics;
}
$poem = new Poem;
$poem->title = "Look at the sea";
$poem->lyrics = "How blue, blue like the sky, in which we fly..."
如果我们尝试使用我们的函数'sing'来调用它;
sing($poem)
我们会收到错误,因为$poem
不是我们在创建函数sing()
时所暗示的对象类型。