1

我想在一些对象中存储一些配置数据,但我有一个问题......

class B {
  const attr1 = 'something1';
  const attr2 = 'something2';
  const attr3 = 'something3';
}

class A {
  const attr1 = 'somethingA1';
  const attr2 = 'somethingA2';
  const attr3 = 'somethingA3';
  const b = <---- i wanna put here a reference of B, but B as a class (not an object...), i'm crazy?
}

我不确定我的例子是否清楚......从A,我想访问B的attr1,比如A::B::attr1,或者类似的东西,还有另一种方法可以做到这一点吗?还是我错了?

4

3 回答 3

2

没有办法分配对类的引用,也没有办法在运行时分配类常量。所以你的整个方法几乎是不可能的。你能做的是

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 更小,您的代码更面向对象。

于 2012-05-06T10:10:43.657 回答
1

你不能像那样引用一个类,因为你使用这个类的唯一方法是通过一个对象,所以尝试这样做也没有意义。

用户这个:

class A {
  const attr1 = 'somethingA1';
  const attr2 = 'somethingA2';
  const attr3 = 'somethingA3';
  public $b;

  function __construct() {
    $this -> b = new b();
}
于 2012-05-06T10:09:24.817 回答
0

你可以简单地说b = "B"..

如果你想创建 B 的对象,你可以做 new b或访问属性

于 2012-05-06T09:54:39.640 回答