为什么类型提示在PHP中是必要的?

vqlkdk9b  于 2023-06-04  发布在  PHP
关注(0)|答案(7)|浏览(511)

我很难理解PHP中类型提示的重要性。
PHP中的“类型提示”可以定义如下:
“类型提示”强制您只传递特定类型的对象。这可以防止您传递不兼容的值,并在您与团队合作时创建一个标准。

  • 因此,在最基本的层次上进行类型提示,实际上并不需要使代码工作?*

我有下面的代码来尝试和理解正在发生的事情...

index.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()函数中的小类型提示,代码都可以完成它的任务;

所以,这让我相信类型提示只是一种编码约定,以确保只使用某些类,而不需要生成函数代码,这是正确的吗?
正如上面引用的话所暗示的,类型暗示是为了 * 如果你和一个团队一起工作 * 创建一个标准。
我错过了什么吗?

izkcnapc

izkcnapc1#

类型提示不是必需的,但它可以让你抓住某些类型的错误。例如,你可能有一个函数或方法需要一个整数。PHP会将happily convert“数字字符串”转换为整数,这可能会导致难以调试的行为。如果您在代码中指定您特别需要一个整数,这可以首先防止这些类型的错误。许多程序员认为以这种方式保护他们的代码是一种最佳实践。
作为一个具体的例子,让我们看一下index.php文件的更新版本:

index.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文件:

Test.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()函数。
这很有用,因为即使上面的示例可以工作,Test类也可以与Song类不同。这可能导致以后难以调试的错误。以这种方式使用提示为开发人员提供了一种在类型错误导致问题之前防止它们的方法。这在像PHP这样的语言中特别有用,因为PHP经常渴望在类型之间进行自动转换。

uttx8gqw

uttx8gqw2#

类型暗示是一个自然的过程。起初,这看起来像是额外的工作,但随着项目在PHP中的增长,这是非常有帮助的。它允许更好的可读性,并使错误控制和严格的编程约定更容易应用。
首先,你必须实现'contract',其中的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

roqulrg3

roqulrg33#

无论有没有类型提示,您的代码都可以正常运行。
类型提示只是强制你将特定类型的东西传递给那个函数/方法。
例如

function displayNames($names)
{
    foreach ($names as $n) {
        echo $n;
    }
}

假设用户按如下方式传入一个数组,此函数将正常工作。

displayNames(array('Tom', 'John', 'Frank'));

但是,PHP允许用户传入任何东西,例如字符串、int、bool、对象等。当它到达displayNames函数内部的foreach时,这些都不会按照您的预期进行操作。
添加一个array类型提示强制执行这个函数期望$names是一个数组的事实。

function displayNames(array $names)
{
    // We now KNOW that $names is an array.
    foreach ($names as $n) {
        echo $n;
    }
}

数组是一个简单的例子,但正如你所说,你也可以输入提示对象。在这种情况下,它允许开发人员只接受doSqlQuery()方法中的数据库连接的示例。

你应该知道

PHP 7以下的版本只允许类(包括接口)和数组的类型提示。为了输入stringintbool等的提示,你需要使用PHP 7。

kqqjbcuj

kqqjbcuj4#

有必要吗?没有
这是最佳实践吗?是的
哪个PHP版本支持它?PHP 5.6只支持类,PHP 7+也允许对原语(int,string,boolean等)进行类型提示。
它有什么用处?
1.通过IDE获取提示(取决于IDE)。
1.标准化团队项目中的编码风格。
1.减少logic errors
1.从PHP是lossy-typed语言,到kindof-strongly-typed PHP,但由开发人员选择使用lossy或strongly。

eaf3rand

eaf3rand5#

类型暗示就像名字更像是一个暗示。它允许开发人员查看哪些类可以作为参数传递,并防止它们传递错误的参数。如果您与不止一个人一起工作在同一个项目上,并且/或者代码是开源的,这将特别有用。
在php7中,字符串、int、(混合)和数组的类型提示已经被添加,因此您不仅需要类,而且还可以使用标准的php类型

41zrol4v

41zrol4v6#

  • 使您的代码更加稳定,特别是在项目很大的情况下
  • 代码可读性更强、更清晰、更专业
  • 在IDE中自动完成
  • 像PHPStan这样的代码嗅探器可以发现你在哪里调用了一个带有错误参数的方法
  • 当你进入一个新的项目时,你可以更容易地理解代码和方法是如何工作的。
  • 如果没有类型提示,如果你用错误的对象调用你的方法,什么都不会发生,因为**$song->title$song->lyrics**将返回null;当使用类型提示时抛出异常
yiytaume

yiytaume7#

它使代码的阅读变得可预测,就像你知道参数是什么类型,你知道函数返回什么类型(如果有的话)。很多时候,当你阅读到不属于你的代码时,你会跟踪自己到一个函数声明,经常你会问自己“等等,参数1或参数X的类型是什么?””当你想知道参数是什么的时候,你不想一遍又一遍地放一个像var_dump()这样的调试器。

相关问题