使用 PHP 7.2,我有一堂课MyClass
使用特质MyFirstTrait
。它的定义如下:
class MyClass
{
use MyFirstTrait;
}
This MyFirstTrait
使用另一个特征MySecondTrait
。它的定义如下:
trait MyFirstTrait
{
use MySecondTrait;
}
MySecondTrait
不使用任何其他特征。它的定义如下:
trait MySecondTrait
{
}
如果我定义MyClass
首先是特征,然后是特征(特征的定义顺序并不重要),会引发错误。
该文件将类似于:
// Not working
class MyClass { use MyFirstTrait; }
// These two lines can be swapped, the result is the same.
trait MyFirstTrait { use MySecondTrait; }
trait MySecondTrait { }
引发的错误是这样的:
Fatal error: Trait 'MyFirstTrait' not found in …
但是,如果我删除嵌套并删除use
条款来自MyFirstTrait
,脚本运行没有错误。如果我先定义特征然后再定义类,也会发生同样的情况。
在第一种情况下,该文件将如下所示:
// Working
class MyClass { use MyFirstTrait; }
trait MyFirstTrait { }
在第二种情况下是这样的:
// Working
// These two lines can be swapped, the result is the same.
trait MyFirstTrait { use MySecondTrait; }
trait MySecondTrait { }
class MyClass { use MyFirstTrait; }
为什么当特征嵌套时行为会改变?
这对我来说没有多大意义,因为在这两种情况下,所使用的特征都是在引用之后定义的。当移除嵌套并且仅使用单个特征时,在定义类之后定义特征没有问题。