2011-01-20 68 views
0

的情況是這樣的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'類將作爲實例被嵌入。

+1

OOPs在你腦海中並不清楚。對象具有它自己的屬性,並且僅與該對象綁定。 – 2011-01-20 08:05:30

+0

聲明類屬性爲靜態 – 2011-01-20 08:06:26

回答

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"; 
?> 
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

這裏是如何做到這一點沒有繼承:

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; 

如果你不喜歡不必$取第一個去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; 

分配儘管我個人認爲第一種方法更易於維護和清晰。