PHP中的对象类型提示

7

我需要帮助理解对象的类型提示。我尝试在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类并手动回显方法的操作有所不同呢?

可能是PHP类型提示:支持数组,但不支持对象?的重复问题。 - user1646111
你遇到错误是因为'smith'是一个字符串而不是一个对象。你必须将$foo传递给doSomething()才能使其正常工作。 - Jean Paul
我尝试在stackoverflow上搜索 - 你尝试过查找文档吗?所有的内容都在那里解释,并且还有示例。 - axiac
1个回答

13

使用你的例子:

$foo = new Person;
$foo->name = 'smith';

$something = doSomething($foo);

echo $something;

类型提示意味着你传递的任何内容都必须是一个实例(与你提示的类型相同)。
因此,如果你提示使用“Person”,那么只有该类型的对象才会被接受。
在你给出的示例中,你试图传递一个字符串而不是一个对象。 更新 “类型提示”强制你只传递特定类型的对象。这可以防止你传递不兼容的值,并且如果你与团队一起工作等,则创建了一个标准。
因此,假设你有一个函数sing()。你想确保它只接受Song类型的对象。
让我们创建我们的类Song:
class Song{

public $title;
public $lyrics;

}

我们的函数 sing()。我们会对 Song 进行类型提示,以确保不会传递其他类型的参数:

function sing(Song $song){

echo "Singing the song called " .$song->title;
echo "<p>" . $song->lyrics . "</p>";

}

现在,再次强调,此函数仅接受Song类型的对象,因为这是我们在声明中提示的(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)

我们会得到一个错误,因为在创建函数 sing() 时,我们提示的对象类型与 $poem 不一致。


@Exploit 在传递参数之前,您必须实例化对象。这就是为什么您会收到错误消息 - 您只传递了一个字符串。类型提示不会将您传递的参数转换为对象。 - Jean Paul
1
抱歉,我的手指误点了鼠标,我无法将其归零。我将在我的电脑上尝试另一个示例并发布更新。不知何故,当我自己尝试时,我一直遇到错误。如果您不介意,能否在答案中发布一个可行的示例?也许这会帮助我更好地理解。谢谢。 - Exploit
非常感谢!写得非常好,易于理解。希望这也能帮助到其他许多人 :) - Exploit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接