繁体   English   中英

PHP:对命名空间实例使用类型提示(标量类型和返回类型)

[英]PHP: using type hinting (scalar types & return types) for namespaced instances

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

我将名称空间类用于所有内容,并将类顶部的“ 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;
    }
}

这个可以吗? 还是我的其他示例是执行此操作的最佳方法?

我不太了解您的问题。

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

  2. 标量类型将向您的同事指示您的方法需要此类的实例。 这很有用,它记录了您的代码并防止了错误。 请参阅该指南。

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

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

  1. 文件顶部的use语句不花任何费用。 更好的是:如果您有很多,这很好地表明了您的班级应该分裂以尊重SRP。 加上它描述了您的依赖关系。 知道您在修改代码时可能会受到的影响总是很高兴的。

结论:我建议您使用标量和返回类型,不要担心use语句。

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

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

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

在命名空间之前,您有一些令人讨厌的类名称,例如Mage_Application1_Entity_Model.php ,它描述了文件路径。 丑陋的地狱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM