2016-02-29 4 views
-3

У меня есть WooCommerce плагин, который имеет класс Foo:Вызов 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); 

Итак, сначала мы создаем объект и возвращаем его. Затем мы вводим его в функцию бара, просто нужно вызвать метод после этого. (Я использовал разные имена переменных, чтобы было легче понять область)

Смежные вопросы