【问题标题】:PHP: using type hinting (scalar types & return types) for namespaced instancesPHP:对命名空间实例使用类型提示(标量类型和返回类型)
【发布时间】:2019-03-24 12:17:16
【问题描述】:

为命名空间实例处理标量类型和返回类型声明的最佳方法是什么?

我对所有内容都使用命名空间类,并为将在文件中使用的所有类使用类顶部的“use”别名。

这是一个不使用标量类型和返回类型声明的示例:

文件 1

use Model\ExampleA\ClassA;
use Model\ExampleB\ClassB;

$classA = new ClassA();
$classB = new ClassB();
$result = $classB->action($classA);

文件 2

namespace Model\ExampleB;

class ClassB
{
    /**
     * @param  ClassA $classA The ClassA instance.
     * @return ClassA         Returns the ClassA instance.
     */
    public function action($classA)
    {
        return $classA;
    }
}

现在如果使用标量类型和返回类型声明,file2 将改为:

namespace Model\ExampleB;

use Model\ExampleA\ClassA;

class ClassB
{
    /**
     * @param  ClassA $classA The ClassA instance.
     * @return ClassA         Returns the ClassA instance.
     */
    public function action(classA $classA) : classA
    {
        return $classA;
    }
}

因此,如果对命名空间实例使用标量或返回类型声明,我必须在 file2 顶部再次使用“use”别名,以便类型提示起作用。

我更喜欢将“对象”数据类型用于标量类型或返回类型用于命名空间实例,并将 @param 和 @return 数据类型保留在 docblock 中,如下所示:

namespace Model\ClassB;

class ClassB
{
    /**
     * @param  ClassA $classA The ClassA instance.
     * @return ClassA         Returns the ClassA instance.
     */
    public function action(object $classA) : object
    {
        return $classA;
    }
}

这样好吗?还是我的其他示例是最好的方法?

【问题讨论】:

    标签: php type-hinting


    【解决方案1】:

    我不太明白你的问题。

    1. 如果两个类(ClassA 和 ClassB)在同一个目录下,则无需使用use 语句。

    2. 标量类型将向您的同事表明您的方法需要此类的实例。这很有用,它记录您的代码并防止错误。将此作为指导方针。

    当然,您的评论将表明同样的事情,但问题是:cmets 可以撒谎。如果有人修改您的代码而不是您的注释以接受对象 ClassC(例如)而不是 ClassA,这将带来相当多的混乱。想象一下这样的整个代码库。

    我看到误导性评论造成了令人讨厌的错误。不止一次。

    1. 文件顶部的 use 语句不需要任何费用。更好的是:如果你有很多,这是一个很好的指标,表明你的班级应该分开以尊重 SRP。此外,它还描述了您的依赖关系。知道修改代码时会产生什么影响总是好的。

    结论:我建议你使用标量和返回类型,不要害怕使用语句。

    解释一下为什么在 PHP 中引入了命名空间:

    命名空间允许您在不同的文件路径中拥有具有相同名称的不同类,而不会发生任何名称冲突。如果您有两个名为 ClassA 的类,解释器如何知道您要使用哪个 ClassA?

    由于您的两个同名类需要位于不同的文件夹中,因此您的命名空间会有所不同。 PHP 会知道使用什么类。它与类实例化无关。

    在命名空间之前,您有一些讨厌的类名,例如描述文件路径的 Mage_Application1_Entity_Model.php。丑得要死。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-24
      • 2019-12-23
      • 2016-05-22
      • 2013-07-11
      • 2022-12-31
      • 2015-11-23
      • 2021-03-11
      • 1970-01-01
      相关资源
      最近更新 更多