【问题标题】:object type hinting in phpphp中的对象类型提示
【发布时间】:2013-07-18 04:12:47
【问题描述】:

我需要帮助理解对象的类型提示。我尝试搜索 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 类并手动回显方法有何不同。

【问题讨论】:

  • 您收到错误消息,因为 'smith' 是字符串而不是对象。您必须将 $foo 传递给 doSomething() 才能使其工作。
  • “我尝试搜索 stackoverflow” -- 您是否尝试搜索文档?一切都在explained 那里,并附有示例。

标签: php type-hinting


【解决方案1】:

用你的例子:

$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)。

让我们创建一首歌曲并传递它:

$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() 时提示的对象类型。

【讨论】:

  • @Exploit 您必须在传递对象之前对其进行实例化。这就是您收到错误的原因 - 您刚刚传递了一个字符串。类型提示不会将您传递的参数转换为对象。
  • 对不起,我的手指点击了鼠标,我无法将其归零。我将在我的计算机上尝试另一个示例并发布更新。出于某种原因,当我自己尝试时,我不断收到错误。如果您不介意可以在答案中发布工作示例吗?也许它会帮助我更好地理解。谢谢
  • 谢谢!写得很好,很容易理解。希望这对其他人也有帮助:)
猜你喜欢
  • 2017-11-21
  • 2023-03-22
  • 2017-09-09
  • 2018-01-04
  • 2015-02-17
  • 2015-09-22
  • 2017-07-05
  • 1970-01-01
相关资源
最近更新 更多