2009-06-19 64 views
0

我有一個啓動另一個類的類,我不關心對象的引用,我只需要該方法並且必須傳入新的參數。用PHP啓動類

class A { 
    __set ..... 
} 

class B extends A { 
    $anotherA = new A; 
    $anotherA->myName = 'stackoverflow'; 
} 
總之

我想有B類擴展,初始化A的新實例,但我不希望有鍵入「新」每次,我見過的語法如下:

B::A // something like that 

但不知道如何使用它,或者如果這會做我想做的事情?

回答

0

我會在B的構造函數創建一個實例,那麼您可以使用它的構造函數或靜態B::create(),剛剛作爲一個快捷方式實例B中。如果你想讓所有的實例化通過create(),你可以使構造函數保密。

class A { 
    // __set ..... 
} 

class B extends A { 
    public function __construct() { 
     parent::__construct(); 
     $anotherA = new A; 
     $anotherA->myName = 'stackoverflow'; 
    } 

    public static function create() { 
     return new self(); 
    } 
} 


new B(); 
B::create(); 
0

既然你是B中延伸的,你可以調用類A的方法:

class B extends A { 
    public function someMethod() { 
     parent::someMethodName(); 
    } 
} 

或者,您可以在類中創建一個靜態方法:如果你真的

class A { 
    public static function someStaticMethod() { ... } 
} 

A::someStaticMethod(); 

想要一個新的實例A,你必須使用new運算符。這就是它的目的。

2

你可以做的是在返回新實例的類上定義一個靜態方法。它基本上是一個'快捷方式',但它在背景中完全一樣。

class C { 
    public static function instance() 
    { 
     return new C(); 
    } 

    public function instanceMethod() 
    { 
     echo 'Hello World!'; 
    } 
} 

現在你可以這樣調用它:

C::instance()->instanceMethod(); 
+0

這是一個可行的辦法,但我看不出這是比任何使用`new`,除非它應該是一個單身或如Doctrine_Query快捷方式::創建()更好 - > ... – 2009-06-19 03:40:32

1

下面是靜態函數舉一些例子 - 他們可以在不使用「新A」或「新B」被調用。

class A { 
    static function message($msg = 'I am Alpha') { 
     echo "hi there, $msg\n"; 
    } 
} 

class B { 
    static function message() { 
     A::message("I am Beta"); 
    } 
} 

A::message(); 
B::message();