2016-02-29 27 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名称,所以它更容易理解作用域)