PHP:继承和实例属性

PHP:继承和实例属性,php,inheritance,instance-variables,Php,Inheritance,Instance Variables,这可能是一个微不足道的问题,但我对php还不熟悉,所以请帮助我理解一些基本概念。以下是我的问题: 我创建了一个类a,而对于另一个类B,我继承了a,这样:类B扩展了a。现在对于类A,我需要在任何时候只运行一个实例。因此,我通过以下方式实现这一目标: class A { private static $instance = NULL; static public function getInstance() { if

这可能是一个微不足道的问题,但我对php还不熟悉,所以请帮助我理解一些基本概念。以下是我的问题:

我创建了一个类a,而对于另一个类B,我继承了a,这样:
类B扩展了a
。现在对于类A,我需要在任何时候只运行一个实例。因此,我通过以下方式实现这一目标:

class A {
        private static $instance = NULL;

        static public function getInstance()
        {
                if (self::$instance === NULL)
                        self::$instance = new x();
                return self::$instance;
        }
...
}
然后从程序调用:

$a = A::getInstance();
现在,在主程序和类A的某个地方,我需要为B声明一个对象。这样:

$b = new B();
我现在想要实现的是$b继承类A的所有属性,这些属性是在A的唯一现有实例中设置的。目前,情况并非如此。 请建议!
使用与
函数getInstance()
帮助相同的逻辑为类a定义构造函数吗?

在B构造函数中尝试类似的方法:

__construct(){
    $toCopy = A::getInstance();
    $this->setAttribute1($toCopy->getAttribute1());
    $this->setAttribute2($toCopy->getAttribute2());
    ...
}
然而,也许你甚至不需要:

Class B{

    private static $_attr1;
    private static $_attr2;

    public static function getAttr1(){
        return self::$_attr1;
    }

    public static function getAttr1(){
        return self::$_attr1;
    }

}

有几种方法可以实现这一点

独生子女 为了确保单例模式,在内部委派大量继承可能更容易。只需在类B中加载singleton A对象,并通过magic方法引用其属性和方法

class B {
    function __construct()
    {
        $this->singletonObj = A::getInstance();
    } 
    function __get($field)
    {
        return $this->singletonObj->$field;
    }
    function __call($func, $args)
    {
        return call_user_func_array(array($this->singletonObj, $func), $args);
    }
    ....
}
静态特性 使用静态属性定义类A

class A {
    protected static $var = null;
    ....
}
class B extends A {
.... // has all the same static values as A
}

不,我需要A类实例。它包含了很多对我的程序很重要的信息。但唯一的问题是,它必须在任何特定时间只有一个实例在运行。因此,当我在B上创建一个新实例时,正如我所想,当访问a的属性时,会得到不需要的默认值。。这些值必须与A的当前运行实例相同编辑后可提供2种解决方案感谢Arthur的帮助。虽然我认为你的第一个解决方案确实解决了我的问题,但它看起来效率不高!将不得不尝试其他我认为静态的方法,但它们在我的情况下不起作用,但是我认为第一个解决方案应该有效,非常感谢!:)