2012-11-23 72 views
1

當方法位於父類中時,如何返回被調用類的實例。創建被調用類的新實例而不是父類

例如,在下面的示例中,如果我撥打B::foo();,如何返回B的實例?

abstract class A 
{ 
    public static function foo() 
    { 
     $instance = new A(); // I want this to return a new instance of child class. 
      ... Do things with instance ... 
     return $instance; 
    } 
} 

class B extends A 
{ 
} 

class C extends A 
{ 
} 

B::foo(); // Return an instance of B, not of the parent class. 
C::foo(); // Return an instance of C, not of the parent class. 

我知道我能做到這樣的事情,但有一個更合適的方法:

abstract class A 
{ 
    abstract static function getInstance(); 

    public static function foo() 
    { 
     $instance = $this->getInstance(); // I want this to return a new instance of child class. 
      ... Do things with instance ... 
     return $instance; 
    } 
} 

class B extends A 
{ 
    public static function getInstance() { 
     return new B(); 
    } 
} 

class C extends A 
{ 
    public static function getInstance() { 
     return new C(); 
    } 
} 
+0

你所寫的代碼應該給一個致命的錯誤。抽象類(A)不能被實例化。 –

+0

它是一個例子。 – Adam

回答

16
$instance = new static; 

您正在尋找Late Static Binding

+0

請參閱http://3v4l.org/PMs8L進行測試。 – deceze

+0

完美的作品,謝謝你接受我的答案! – Adam

1

http://www.php.net/manual/en/function.get-called-class.php

<?php 

class foo { 
    static public function test() { 
     var_dump(get_called_class()); 
    } 
} 

class bar extends foo { 
} 

foo::test(); 
bar::test(); 

?> 

結果

string(3) "foo" 
string(3) "bar" 

所以你的函數將會是:

public static function foo() 
{ 
    $className = get_called_class(); 
    $instance = new $className(); 
    return $instance; 
} 
0

所有你需要的是:

abstract class A { 
    public static function foo() { 
     $instance = new static(); 
     return $instance ; 
    } 
} 

或者

abstract class A { 
    public static function foo() { 
     $name = get_called_class() ; 
     $instance = new $name; 
     return $instance ; 
    } 
} 
相關問題