我在 laravel 中的同一个 App 文件夹中有一个类和一个特征
MyClass.php
<?php
namespace App;
class MyClass {
use myTrait;
CONST MY_CONST = 'CONST';
public function showConst() {
echo $this->myTraitMethod();
}
}
MyTrait.php
<?php
namespace App;
class MyTrait {
public function myTraitMethod() {
return self::MY_CONST; // Undefined class constant 'MY_CONST'
return static::MY_CONST; // Undefined class constant 'MY_CONST'
return MyClass:MY_CONST; // This is the only one that works but I'm forcing the class name
}
}
问题是我无法访问 MY_CONST 除非我强制使用父类名称,这对我来说不是解决方案。
更新 问题出在 vscode 上,我的意思是代码在 self 和 static 下都运行良好,但 vscode 返回错误
Undefined class constant 'MY_CONST'
我更新了问题标题以匹配实际问题
在 PHP 中,特征充当可重用的代码块,可以包含在多个类中。这种方法允许开发人员在各个类之间共享方法,而不受继承的限制,继承仅支持单个父类。然而,有一个缺点:特征不能直接引用包含它们的类中定义的常量。存在这种限制是因为常量特定于每个类,并且对于特征本身并不可见。
在您的原始设置中:
您有一个名为 MyClass 的类,它定义了常量 MY_CONST。
您想在名为 MyTrait 的特征中使用此常量。
但是,直接从特征访问 MY_CONST 会导致错误,除非类名被硬编码,这具有限制性并降低了特征的灵活性。
解决方法 为了解决这个问题,我们可以在特征中引入一个抽象方法。抽象方法不包含任何实现,但强制任何类使用该特征来定义它。通过这样做,我们创建了一种方法,让类将常量的值传递给特征,而特征不需要直接访问常量本身。