0

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

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

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

文件 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;
    }
}

这个可以吗?或者我的另一个例子是最好的方法吗?

4

1 回答 1

0

我真的不明白你的问题。

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

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

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

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

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

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

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

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

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

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

于 2018-10-19T15:20:42.983 回答