Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OOP如何对配置数据进行分组_Php_Oop_Constants - Fatal编程技术网

PHP OOP如何对配置数据进行分组

PHP OOP如何对配置数据进行分组,php,oop,constants,Php,Oop,Constants,我想在一些对象中存储一些配置数据,但我有一个问题 class B { const attr1 = 'something1'; const attr2 = 'something2'; const attr3 = 'something3'; } class A { const attr1 = 'somethingA1'; const attr2 = 'somethingA2'; const attr3 = 'somethingA3'; const b = <---

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

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?
}
B类{
常量attr1='something1';
常量attr2='something2';
常量attr3='something3';
}
甲级{
常量attr1='somethingA1';
常量attr2='somethingA2';
常量attr3='somethingA3';

常数b=您可以简单地说
b=“b”


如果你想创建B的对象,你可以做
新建B
或者访问属性你不能引用这样的类,因为你使用这个类的唯一方法就是通过一个对象,所以尝试这样做也没有意义

此用户:

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

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

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

const b = 'B' 
从PHP5.3.0开始,您可以

$b = A::b;
echo $b::attr1;
但是您不能执行
A::b::attr1
。这将引发
T\u PAAMAYIM\u NEKUDOTAYIM
错误。这是解析器的限制。在撰写本文时,PHP无法执行此操作



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

您可以很容易地解决这个问题,例如,您可以在创建
A

class A
{
    private $b;

    public function __construct(B $b)
    {
        $this->b = $b;
    }
}
$a = new A(new B);
或者,例如

因为
B
只是
A
的数据部分,而不是先抓住
B
然后使用B的方法。因此,任何使用
A
的代码都不需要知道
A
中有一些
B
。这将允许您轻松地更改
B
,而无需担心消耗的代码
A
,例如,要获取
attr1
您需要向
A
添加一个getter:

public function getAttr1()
{
    $b = $this->b;
    return $b::attr1;
}
public function getAttr1()
{
    return $this->b->getAttr1();
}
B
中使用属性而不是常量时,您可以减轻对赋值的笨拙需求(在PHP中常量很愚蠢,因为您必须将它们视为公共API),例如

然后您可以在
A
中执行以下操作:

public function getAttr1()
{
    $b = $this->b;
    return $b::attr1;
}
public function getAttr1()
{
    return $this->b->getAttr1();
}

更好的做法是,不要通过
A
公开
B
的内部结构。这将使API更小,代码更面向对象。

为什么要这样做?因为类B包含A的一组数据,我想存储在B(A的)中一个复杂的数据,我想这样做,因为我想保持代码干净,我知道我只能使类a具有所有属性…我不知道你在做什么,但它肯定不会使代码干净…你不能使用一个嵌套了多个数组的数组来分组你的配置,如果你必须的话,我想你可以使用一个单独的私有数组数组,并提供适当的acessor。Sry的家伙们,我的英语不好,顺便说一句,Tom理解我,这是我的第一个单独的php项目,我想“分组我的配置数据”这就是重点,我会使用oop来做这件事…是的,但是OP需要先创建一个A的实例,然后s/他才能访问B。s/他不能执行
A::B::attr1
,也不能执行
$A->B::attr1
。你应该将此添加到你的答案中以使其完整。谢谢你的解释,我已经在使用你的第二个解决方案了(在A中创建B),但在我看来,这不是最好的解决方案(因为我必须实例化A,但我并不真正需要实例),但我认为这不是另一种方法(现在:P)。@cl0udw4lk3r如果你使用OOP,通常会有实例。如果你发现使用类、常量和静态进行编码,那么你就改为使用基于类的编程。看看