2015-09-07 1 views
1

У меня есть общий родительский пункт класс для элементов базы данных, какphp - Почему вызов статических методов из классов sibling не работает без создания экземпляра?

class item { 
    function set($i = '') { 
     //set element in database 
    } 

    function get($id = '') { 
     //get element in database 
     return $item; 
    } 
} 

У меня есть различные классы, реализующие родителя элемента, как пользователей и событий - когда я вызываю метод набора внутри пользователей для класс событий, как

class users extends item { 
    function dothis() { 
     events::set(array('start' => 'today', 'end' => 'tomorrow')); 
    } 
} 

он действует, как если бы я написал

class users extends item { 
    function dothis() { 
     self::set(array('start' => 'today', 'end' => 'tomorrow')); 
    } 

} 

пытается вставить событие в таблице пользователей, так что я должен создать экземпляр класса таким образом

class users extends item { 
    function dothis() { 
     $e = new events(); 
     $e->set(array('start' => 'today', 'end' => 'tomorrow')); 
    } 

} 

я делаю что-то неправильно? Есть ли способ избежать создания экземпляра?

EDIT - Все классы в моей рамках называются статически, без необходимости нового или $ это, и она прекрасно работает.

+0

где находится 'event' класс? –

+0

Если вы пытаетесь вызвать метод в том же классе, используйте '$ this-> get', синтаксис' self :: ',' ​​static :: '(и более) для статических методов, который' set() 'и' get() 'не являются. –

+1

'Все классы в моей структуре вызываются статическим образом ... он отлично работает' - нагло это не =). – AD7six

ответ

1

Если вы хотите использовать статические методы, вы также должны объявить свои методы, как:

protected static function set($i = '') { 

protected static function get($id = '') { 

Таким образом, вы можете позвонить и self::set(...)self::get(...).

Если вы хотите использовать не-статические методы, которые вы только должны изменить

self::set(...) 

в

$this->set(...) 
+0

У вас возникнут проблемы с поздним статическим связыванием с использованием 'self ::' - вам следует ссылаться на релиз vant docs в руководстве по php, никакие статические ключевые слова не указывают на довольно фундаментальное недоразумение/недостаток знаний относительно статических/экземплярных методов/свойств/понятий. – AD7six

+0

Я знаю это, но я использую все неявно без необходимости выражать защищенный статический. Он просто не выполняет вызовы методов неявно между братьями и сестрами. –

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