2015-10-16 105 views
2

這裏是我的代碼:兒童影響類的父類

class Parent1 
{ 
    static $db = null; 

    public function __construct() 
    { 
     self::$db = 'a'; 
    } 
} 

class Child extends Parent1 
{ 

    public function __construct() 
    { 
     parent::__construct(); 
     self::$db = 'b'; 
    } 
} 

$myParent = new Parent1(); 
echo $myParent::$db; //"a" 

$myChild = new Child(); 
echo $myChild::$db; //"b" 
echo $myParent::$db; //"b" it should be "a" 

爲什麼$myParent::$db正在改變b?如何防止它?

回答

0

爲什麼?

static $db = null; 

$dbstatic,它不掛實例。
self::$db = 'b';將更改$db的唯一和共享實例。

如何預防?

你不能。這就是static字段的工作原理。
順便說一句,從實例($aa::field)調用static不是一個好主意。

看看documentation about static in PHP因爲你可能不明白它是如何工作的。

0

您正在使用靜態變量。這些都是課程級別,並在所有實例中共享。您可能想要將它們更改爲實例變量......請參閱下面的內容。

<?php 
class Parent1 
{ 
    public $db = null; 

    public function __construct() 
    { 
     $this->db = 'a'; 
    } 
} 

class Child extends Parent1 
{ 

    public function __construct() 
    { 
     parent::__construct(); 
     $this->db = 'b'; 
    } 
} 

不過,寫入$ myChild-> dB的變量從父改變,因爲它是一種遺傳性的變量,但它不會影響從$ myParent的$分貝值。

0

我找到了解決方案。我在兒童重新聲明靜態 - 現在它工作。 感謝您解釋靜態

class Parent1 
{ 
    static $db = null; 

    public function __construct() 
    { 
     self::$db = 'a'; 
    } 
} 

class Child extends Parent1 
{ 
    static $db = null; 

    public function __construct() 
    { 
     parent::__construct(); 
     self:$db=parent::$db; 
     self::$db = 'b'; 
    } 
} 

$myParent = new Parent1(); 
echo $myParent::$db; //"a" 

$myChild = new Child(); 
echo $myChild::$db; //"b" 
echo $myParent::$db; //"a" => as it should