没有办法分配对类的引用,也没有办法在运行时分配类常量。所以你的整个方法几乎是不可能的。你能做的是
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
轻松解决此问题,例如,您可以在创建时注入B
A
A
class A
{
private $b;
public function __construct(B $b)
{
$this->b = $b;
}
}
$a = new A(new B);
或在内部创建B
A
,例如
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();
}
更好的是不要完全暴露B
through的内部结构,A
而只添加对 A 执行某些操作的公共方法。这将使您的 API 更小,您的代码更面向对象。