2011-10-07 56 views
3

我對OOP很陌生,在PHP上很生疏。我想知道這是否是從類調用函數的有效方法?類中的PHP調用函數 - 有沒有更簡單的方法?

class newclass { 
    public function testfunc { 
     return '1'; 
    } 
} 

我可以這樣稱呼它:

echo testfunc->newclass(); 

或像這樣:

echo newclass()::testfunc; 

我總是看到它實施例中定義如下圖所示,它似乎是額外的代碼?:

$this = new newclass(); 
$this->testfunc(); 
echo $this; 

任何幫助將grea因爲我剛剛開始圍繞這個面向對象的事情而感到欣慰。如果我外出吃午飯,也許有人可能會建議一個真正的好的指導,爲一個真正的初學者在課堂/面向對象的鏈接。謝謝!

+5

http://php.net/manual/en/language.oop5.php – NullUserException

回答

1

你可以做testfunc靜態的,並調用它像這樣:

class newclass{ 

    public static function testfunc{ 

    return '1'; 
    } 
} 

echo newclass::testfunc(); 

有沒有像這樣echo testfunc->newclass();和做它像

$class = new newclass(); 
echo $class->testfunc(); 

是這樣做時,該方法的正確方法一個實例方法,而不是一個靜態方法。 注意,沒有能力在靜態方法內引用$this

2

new是實例化類的關鍵字。如果你想使用一個沒有類實例的方法,它應該是一個靜態方法。有一個靜態方法,聲明該方法爲靜態。

class foo 
{ 
    public static function bar() 
    { 
     return 'hello!'; 
    } 
} 

如何使用它?

echo foo::bar(); //Will print hello 
+1

我覺得你錯過了某處的'function'。 – sberry

+0

謝謝,我發現這有幫助。如果我要說用一個連接到數據庫的函數創建一個數據庫類。我可能會使它成爲一個靜態的方法? – DieselPower

-2

可以包括包含您的功能

<?php 
//print.php 
function printHello(){ 
echo "Hello world"; 
} 
?> 

然後包括它並調用該函數的PHP文件...

<?php 
include "print.php"; 
printHello(); 

?> 
+0

這確實不會回答這裏提出的問題。 – markus

+0

好吧我的壞....... –

0

可以爲構造函數創建一個靜態包裝這將允許在同一行上鍊接方法調用。

<?php 

class ClassA { 

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

    function method1() { ... } 

} 


ClassA::create()->method1(); 
4

這兩種方式的工作,並有他們的用例。

你的第一種情況是使用類的實例進行常規函數調用,第二種情況是對靜態函數的調用。

靜態應該小心使用,它的使用通常是重構/重新設計的必要標誌。

面向對象編程的要點是通過編寫類(藍圖)對世界進行建模,然後根據需要使用new來創建該類的獨立實例。每個實例都是具有類的DNA的小生物體,您可以在每個實例上調用相同的類方法而不影響其他實例。

但是,靜態調用與類的實例無關,因此沒有使用對象。這是一個全球性的工具功能調用,實際上打破了封裝思想。

所以,我並不是說沒有靜態類和方法的用例,但應該小心使用它們。

+0

「靜態應該小心使用,它的使用往往是一個跡象,重構/重新設計是必要的」我喜歡這條線。 – dpp

+0

感謝您的深入解釋。我在另一個回覆中發佈了一個問題,想知道靜態方法是否適合db類中的數據庫連接函數。你有什麼想法/原因? – DieselPower

+0

IMO沒有任何意義。您希望能夠創建多個句柄並將實例存儲在註冊表中等等。 – markus

相關問題