处理命名空间实例的标量类型和返回类型声明的最佳方法是什么?
我将命名空间类用于所有内容,并将类顶部的“ 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'别名,以便类型提示起作用。
我更喜欢将'object'数据类型用于标量类型,将return类型用于命名空间的实例,并将@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;
}
}
这样可以吗?还是我的其他示例是执行此操作的最佳方法?
答案 0 :(得分:0)
我不太了解您的问题。
如果两个类(ClassA和ClassB)都在同一目录中,则无需使用use
语句。
标量类型将向您的同事指示您的方法需要此类的实例。这很有用,它记录了您的代码并防止了错误。请参阅该指南。
当然,您的评论将表明同一件事,但问题是:评论可能存在。如果有人修改您的代码而不是您的注释来接受对象ClassC(例如)而不是ClassA,则会带来很多混乱。想象一下这样的整个代码库。
我看到了引起误解的评论,造成了令人讨厌的错误。不止一次。
结论:我建议您使用标量和返回类型,不要对use语句感到害怕。
稍微解释一下为什么在PHP中引入了名称空间:
命名空间使您可以将具有相同名称的不同类放在不同的文件路径中,而不会发生名称冲突。如果您有两个称为ClassA的类,那么解释器如何知道您要使用哪个ClassA?
由于两个具有相同名称的类需要位于不同的文件夹中,因此您的命名空间将有所不同。 PHP将知道要使用什么类。它与类实例化无关。
在命名空间之前,您有一些令人讨厌的类名称,例如Mage_Application1_Entity_Model.php
,它描述了文件路径。丑陋的地狱。