2016-02-29 102 views
-3

的我有了一個類Foo一個woocommerce插件:調用WordPress的功能了

function wc_foo_init(){ 
class WC_Foo extends WC_Shipping_Method{ 
    $var=get_option(); //gets an option for this session 
    function sayHello(){ 
     echo $var; 
    } 
new WC_Foo(); 
} 

我想打電話給sayHello()Foo類:

function bar(){ 
    WC_Foo->sayHello(); 
} 

,但我得到這個錯誤:

Fatal error: Call to a member function `sayHello` on a non-object. 
+0

你不能''something = new WS_Foo(); $ something->的sayHello();'? – FirstOne

+0

不,我編輯帖子。我有另一個構造函數。 –

+0

因爲'sayHello()'是一個普通的非靜態方法,所以你需要一個'WC_Foo'類的實例來調用它。沒有更多的信息,你如何創建它,並且它的生命週期是我們無法真正猜到的。 –

回答

0

如果您正在調用在類中的方法

function bar(){ 
    $this->sayHello(); 
} 

如果你想從別的地方調用該方法, 你需要實例化的類是這樣的:

$object = new WC_Foo(); 
$object->sayHello(); 

,或使方法靜態這樣的:

public static function sayHello(){ 
    echo "Hello"; 
} 

,並調用它是這樣的:

WC_Foo::sayHello(); 
// this way you dont need $object = new WC_Foo(); 
+0

現在它給出了:'致命的錯誤:使用$ this當不在對象上下文中' –

+1

我不是downvoter萬一你有任何問題,但在問題中說:_sayHello()**超出了Foo類:_。由於它不在類中,所以使用'$ this'並沒有多大意義。 – FirstOne

+0

是的,我只是注意到了,所以我擴大了我的答案 – Sasha89

0

您必須在其方法使得調用之前實例化類:

$foo = new WC_Foo(); 
$foo->sayHello(); 

,或者如果你的php版本比5.4更大,你可以這樣做:

(new WC_Foo())->sayHello(); 
0

這可能不是完整的代碼,所以你在那裏很奇怪,但我們走吧。

既然你有一個函數來初始化你的對象,那麼你可能希望至少返回那個實例。此代碼可能會幫助您瞭解:

function init_foo(){ 
    class foo{ 
     function say(){ 
      echo 'hello'; 
     } 
    } 
    $foo1 = new Foo(); 
    return $foo1; 
} 

function bar($foo3){ 
    $foo3->say(); 
} 

$foo2 = init_foo(); 
bar($foo2); 

因此,首先我們創建對象並將其返回。然後我們將它注入到bar函數中,之後只需要調用該方法。 (我使用了不同的var名稱,所以它更容易理解作用域)