【问题标题】:PHP OOP how to group configuration dataPHP OOP 如何对配置数据进行分组
【发布时间】:2012-05-06 09:52:38
【问题描述】:

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

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 或类似的东西,还有另一种方法可以做到这一点吗?还是我错了?

【问题讨论】:

  • 你为什么要这样做?
  • 因为B类包含A的一组数据,我想在b(A)中存储一个复杂的数据,我想这样做是因为我想保持代码干净,我知道我只能制作具有所有属性的 A 类...
  • 我不确定你在做什么,但它肯定不会使代码干净......
  • 你不能使用一个嵌套了几个数组的数组来分组你的配置,如果你必须的话,我猜你可以使用一个私有数组的单例并根据需要提供访问器。
  • 对不起,我的英语不好,顺便说一句,汤姆理解我,这是我第一个孤独的 php 项目,我想“对我的配置数据进行分组”,这就是重点,我会使用 oop 来做到这一点。 .

标签: php oop constants


【解决方案1】:

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

const b = 'B' 

从 PHP 5.3.0 开始,您可以这样做

$b = A::b;
echo $b::attr1;

但你不能这样做A::b::attr1。这将引发T_PAAMAYIM_NEKUDOTAYIM 错误。这是解析器的限制。在撰写本文时,PHP 无法做到这一点。


因为B类包含A的一组数据,我想在b(A)中存储一个复杂的数据,我想这样做是因为我想保持代码干净

您可以通过making B a composite of A 轻松解决此问题,例如你要么 inject B into A 当你创建 A

class A
{
    private $b;

    public function __construct(B $b)
    {
        $this->b = $b;
    }
}
$a = new A(new B);

create B inside A,例如

class A
{
    private $b;

    public function __construct()
    {
        $this->b = new B;
    }
}

因为B只是A的数据部分,you tunnel all public access through A而不是获取B然后使用B的方法。所以任何使用A的代码都不需要知道A里​​面有一些B。这将允许您轻松更改B,而无需担心消耗A 的代码,例如要获得attr1,您需要向A 添加一个getter:

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();
}

最好不要完全暴露BA 的内部结构,而只暴露add public methods that do something with A。这将使您的 API 更小,代码更面向对象。

【讨论】:

  • 非常感谢您的巨大解释,我已经在使用您的第二个解决方案(在 A 中创建 B),但不是最好的解决方案(因为我必须实例化 A,但我真的不需要例如)在我看来,但我认为这不是另一种方式(还:P)。
  • @cl0udw4lk3r 如果你做 OOP,你通常会有实例。如果您发现使用类、常量和静态进行编码,那么您就是在进行基于类的编程。看看kore-nordmann.de/blog/0103_static_considered_harmful.html
【解决方案2】:

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

用户:

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

  function __construct() {
    $this -> b = new b();
}

【讨论】:

  • 是的,但是 OP 需要在他/她可以访问 B 之前创建一个 A 的实例。并且他/她不能做 A::B::attr1,也不能做 $a-&gt;b::attr1。您应该将此添加到您的答案中以使其完整。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多