为什么 PHP 中需要类型提示?

2022-08-30 13:24:26

我很难理解PHP中类型提示的重要性。

显然,PHP中的“类型提示”可以定义如下:

“类型提示”强制您仅传递特定类型的对象。这可以防止您传递不兼容的值,并在与团队合作等时创建标准。

那么类型提示在最基本的层面上,是不是需要真正让代码工作呢?

我有以下代码来尝试并理解发生了什么...

索引.php

<?php
include 'Song.php';

$song_object = new Song;

$song_object->title = "Beat it!";
$song_object->lyrics = "It doesn't matter who's wrong or right... just beat it!";


function sing(Song $song)
{
    echo "Singing the song called " . $song->title;
    echo "<p>" . $song->lyrics . "</p>";
}

sing($song_object);

歌曲.php

<?php

class Song
{
    public $title;
    public $lyrics;
}

代码在函数sing()中使用或不带有小类型提示即可完成其操作;

enter image description here

因此,这使我相信类型提示只是一种编码约定,以确保仅使用某些类并且不需要生成功能代码,这是正确的吗?

如上面的引文所示,类型提示是为了创建一个标准,如果你正在与一个团队合作

我在这里错过了什么吗?


答案 1

类型提示不是必需的,但它可以让你发现某些类型的错误。例如,您可能有一个需要整数的函数或方法。PHP会很乐意将“数字字符串”转换为整数,这可能会导致难以调试的行为。如果在代码中指定特别需要一个整数,则可以首先防止此类 Bug。许多程序员认为以这种方式保护他们的代码是一种最佳实践。

作为实际操作的具体示例,让我们看一下文件的更新版本:index.php

索引.php

<?php
include 'Song.php';
include 'Test.php';

$song_object = new Song;
$test_object = new Test;

$song_object->title = "Beat it!";
$song_object->lyrics = "It doesn't matter who's wrong or right... just beat it!";

$test_object->title = "Test it!";
$test_object->lyrics = "It doesn't matter who's wrong or right... just test it!";


function sing(Song $song)
{
    echo "Singing the song called " . $song->title;
    echo "<p>" . $song->lyrics . "</p>";
}

sing($song_object);
sing($test_object);

以及我添加的新文件:Test.php

测试.php

<?php

class Test
{
    public $title;
    public $lyrics;
}

当我现在运行时,我收到以下错误:index.php

输出:

Singing the song called Beat it!<p>It doesn't matter who's wrong or right...
just beat it!</p>PHP Catchable fatal error:  Argument 1 passed to sing() must
be an instance of Song, instance of Test given, called in test/index.php on
line 22 and defined in test/index.php on line 15

Catchable fatal error: Argument 1 passed to sing() must be an instance of
Song, instance of Test given, called in test/index.php on line 22 and defined
in test/index.php on line 15

这是PHP让我知道当我调用函数时我试图使用错误类型的类。sing()

这很有用,因为即使上面的示例有效,该类也可能与类不同。这可能会导致以后难以调试的错误。以这种方式使用提示为开发人员提供了一种在类型错误导致问题之前防止它们的方法。这在像PHP这样的语言中特别有用,它通常渴望在类型之间自动转换。TestSong


答案 2

类型提示是一个自然的过程。起初,这似乎是额外的工作,但随着你的项目在PHP中的发展,这是非常有帮助的。它允许更好的可读性,并使错误控制和严格的编程约定更容易应用。

最初,您必须实现“contract”,其中合约是一个php接口,可以“锁定”常量和关键的公共方法及其参数,如下所示:

interface SongInterface {
    //...
}

class Song implements SongInterface
{
    public $title;
    public $lyrics;
    //...
}

然后继续实际执行部分:

$song = (object) new Song;

$song->title = (string) "Beat it!";
$song->lyrics = (string) "It doesn't matter who's wrong or right... just beat it!";


function sing(SongInterface $song): string
{
    $html = (string)  "Singing the song called " . $song->title
    . "<p>" . $song->lyrics . "</p>";

    return htmlentities($html, ENT_QUOTES, 'utf-8');
}

echo sing($song);

使用接口,您只需定义函数,然后在 song 类中实现它。通过这种方式,您可以随时注入另一个歌曲类(具有较新的功能和更改),而不会破坏您的应用程序。查看 oop 接口:http://php.net/manual/en/language.oop5.interfaces.php

从 php7 开始,您还可以定义函数的返回类型。https://wiki.php.net/rfc/return_types


推荐