2014-12-01 37 views
-1

試圖使用擴展singletone的對象,但是我不能這樣做。 如何從擴展類調用方法?PHP如何從擴展類中調用方法

如何顯示13非12單身?

class SingletonTest 
{ 
    protected static $_instance; 

    private function __construct(){} 

    private function __clone(){} 

    public static function getInstance() { 

     if (null === self::$_instance) { 
      self::$_instance = new self(); 
     } 

     return self::$_instance; 
    } 

    public function test2(){ 
     return 12; 
    } 
} 


class ExtendSingleton extends SingletonTest 
{ 
    public function test2() { 
     return 13; 
    } 
} 


$b = ExtendSingleton::getInstance(); 
echo $b->test2(); //12 
+0

您從'SingletonTest'一個對象,所以你不能得到'13'此類不延長'ExtendSingleton'! – Rizier123 2014-12-01 19:29:58

+0

那麼沒有辦法延續單人一人? – 2014-12-01 19:36:03

+0

是的,但你必須讓一個ExtendSingleton對象在那裏形成,你可以訪問'ExtendSingleton'和'SingletonTest'的方法。 – Rizier123 2014-12-01 19:37:19

回答

1

你會得到你想要的東西,如果你使用靜態綁定關鍵字「靜態」,而不是OD「自我」

class SingletonTest 
{ 
    protected static $_instance; 

    private function __construct(){} 

    private function __clone(){} 

    public static function getInstance() { 

     if (null === static::$_instance) { 
      static::$_instance = new static(); 
     } 

     return static::$_instance; 
    } 

    public function test2(){ 
     return 12; 
    } 
} 


class ExtendSingleton extends SingletonTest 
{ 
    public function test2() { 
     return 13; 
    } 
} 


$b = ExtendSingleton::getInstance(); 
echo $b->test2(); //13 

$a = SingletonTest::getInstance(); 
echo $a->test2(); //13 

exit; 

但是當你看到在上面的例子中這樣的一類,你將首先調用「getInstance」將把它的實例存儲在$ _instance字段中。

沒有辦法創建基本singletone類並繼承singletone行爲。

+0

謝謝,多數民衆贊成我需要! – 2014-12-01 20:01:17

1
public static function getInstance() 
{ 
    static $instances = array(); 

    $calledClass = get_called_class(); 

    if (!isset($instances[$calledClass])) 
    { 
     $instances[$calledClass] = new $calledClass(); 
    } 

    return $instances[$calledClass]; 
} 
+0

get_called_class()僅在PHP> = 5.3中 – bicccio 2014-12-01 19:45:05

+1

但是會有一個對象。 – 2014-12-01 19:45:08

+1

@ShkarbatovDmitriy父類中的靜態實例屬性對於該類的所有實例(包括子類)都是全局的。這是如何靜態在PHP中工作。如果您希望它是子類特定的,或者使用某種數組來存儲每個子子類實例變量,則必須將該實例變量移動到每個子類。 – 2014-12-01 19:47:36

0

所以這應該爲你工作:

(所以第一常函數是公共的,所以如果你從另一個類擴展,你可以用它們而你必須做出一個對象從! ExtendSingleton不是從SingletonTest因爲ExtendSingleton exdend的 - >SingletonTest,而不是其他方式)

<?php 

    class SingletonTest { 

     protected static $_instance; 

     public function __construct() { 

     } 

     public function __clone() { 

     } 

     public static function getInstance() { 

      if (null === self::$_instance) { 
       self::$_instance = new self(); 
      } 

      return self::$_instance; 
     } 

     public function test2(){ 
      return 12; 
     } 
    } 


    class ExtendSingleton extends SingletonTest { 

     public function test2() { 
      return 13; 
     } 

    } 


    $b = new ExtendSingleton(); 
    echo $b->test2(); //13 


?> 

出放:

13 
+0

是的,但這不是單數。 – 2014-12-01 19:44:22

0

我測試過bicccio的解決方案,它的工作原理

class SingletonTest 
{ 
    protected static $_instances = []; 

    private function __construct(){} 

    private function __clone(){} 

    public static function getInstance() 
    { 
     $calledClass = get_called_class(); 

     if (!isset(self::$_instances[$calledClass])) 
     { 
      self::$_instances[$calledClass] = new $calledClass(); 
     } 

     return self::$_instances[$calledClass]; 
    } 

    public function test2(){ 
     return 12; 
    } 
} 


class ExtendSingleton extends SingletonTest 
{ 
    public function test2() { 
     return 13; 
    } 
} 


$b = ExtendSingleton::getInstance(); 
echo $b->test2(); //13 

$a = SingletonTest::getInstance(); 
echo $a->test2(); //12 
+0

首先爲什麼2個答案?如果你測試了另一個答案,你爲什麼寫一個新的答案? – Rizier123 2014-12-01 19:57:06

+0

對不起,我是一個菜鳥 – 2014-12-01 20:26:16