PHP类父实例(Singleton)

时间:2011-01-20 08:02:16

标签: php

场景是这个

class a
{
  public $val;
}

class b extends a
{

}

class c extends b
{

}

$one = new b();
$one->val = "a value";

$other = new c();

echo $other->val;
// wanted 'a value', got ''

所以我需要的结果是:“一个值”,但当然是空白的。

我需要的是'a'类始终用作'b'中的实例。因此,每当我使用扩展'b'的类时,父'a'类将作为实例固有。

3 个答案:

答案 0 :(得分:1)

由于$other = new c();实际上是在创建新实例,因此无法实现 但是如果你将val声明为静态成员,那么你将得到你想要的结果。

    <?
class a
{
  public static $val;
}

class b extends a
{

}

class c extends b
{

}

$one = new b();
a::$val = "a value";



echo c::$val;

答案 1 :(得分:1)

如果您阅读关于static关键字的php手册,它会提供您正在尝试执行的操作的示例。您可以在此处阅读:http://www.php.net/manual/en/language.oop5.static.php

以下是他们使用的示例代码。

<?php
class Foo
{
    public static $my_static = 'foo';

    public function staticValue() {
        return self::$my_static;
    }
}

class Bar extends Foo
{
    public function fooStatic() {
        return parent::$my_static;
    }
}


print Foo::$my_static . "\n";

$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n";      // Undefined "Property" my_static 

print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n"; // As of PHP 5.3.0

print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>

答案 2 :(得分:1)

以下是没有继承的方法:

class A
{
    public $foo;
}
class B {
    public function __construct(A $a)
    {
        $this->a = $a;
    }
}
class C {
    public function __construct(A $a)
    {
        $this->a = $a;
    }
}

$a = new A;
$b = new B($a);
$c = new C($a);
$b->a->val = 'one value';
echo $c->a->val;

如果您不想首先获取$ a来获得val,您可以通过引用分配

class A
{
    public $foo;
}
class B {
    public function __construct(A $a)
    {
        $this->val = &$a->val;
    }
}
class C {
    public function __construct(A $a)
    {
        $this->val = &$a->val;
    }
}

$a = new A;
$b = new B($a);
$c = new C($a);
$b->val = 'one value';
echo $c->val;

虽然我个人认为第一种方法更易于维护和清晰。