没有办法分配对类的引用,也没有办法在运行时分配类常量。所以你的整个方法几乎是不可能的。你能做的是
const b = 'B'
从 PHP 5.3.0 开始,您可以这样做
$b = A::b;
echo $b::attr1;
但你不能这样做A::b::attr1。这将引发T_PAAMAYIM_NEKUDOTAYIM错误。这是解析器的限制。在撰写本文时,PHP 无法做到这一点。
因为B类包含A的一组数据,我想在b(A)中存储一个复杂的数据,我想这样做是因为我想保持代码干净
您可以通过B合成 来A轻松解决此问题,例如,您可以在创建时注入BAA
class A
{
private $b;
public function __construct(B $b)
{
$this->b = $b;
}
}
$a = new A(new B);
或在内部创建BA,例如
class A
{
private $b;
public function __construct()
{
$this->b = new B;
}
}
因为B只是 的数据部分A,所以您通过隧道传输所有公共访问,A而不是获取B然后使用 B 的方法。所以任何使用的代码A都不需要知道里面有B什么A。这将允许您轻松更改B,而无需担心消耗的代码A,例如让attr1您添加一个 getter 到A:
public function getAttr1()
{
$b = $this->b;
return $b::attr1;
}
在使用属性而不是常量时,您可以减轻对赋值的笨拙需求B(无论如何,常量在 PHP 中都是愚蠢的,因为您必须将它们视为公共 API),例如
class B
{
private $attr1;
public function getAttr1()
{
return $this->attr1;
}
}
然后你可以做A:
public function getAttr1()
{
return $this->b->getAttr1();
}
更好的是不要完全暴露Bthrough的内部结构,A而只添加对 A 执行某些操作的公共方法。这将使您的 API 更小,您的代码更面向对象。