Контроллеры не являются статичными в Kohana, хотя они могут содержать статические переменные / методы или константы-члены.
self::
это сокращенный способ написания ClassName::
т.е.
class Animal
{
public static $arms = 0;
}
class Dog extends Animal
{
public static $leg = 0;
const NAME = 'dog';
public static function bark()
{
echo 'Woof';
}
}
Для вызова статических функций или получения констант из класса мы используем оператор разрешения области действия ::
. Статические функции для класса не для объекта. Сказать, что ::
относится к статическим экземплярам класса, неправильно, это просто способ доступа к статическим методам - нет экземпляра объекта, который имеет эти методы.
так:
Dog::bark(),
Dog::$leg,
Dog::NAME,
мы также можем использовать
Animal::$arms
Внутри класса Dog мы можем использовать self::
и parent::
, поэтому нам не нужно вводить полное имя класса (так как оно может быть очень длинным!)
В ответ на ваш вопрос: Нет - self::
не считается устаревшим, и нет ничего плохого в том, чтобы его использовать. Причина, по которой он не используется в ядре kohana, по совсем другой причине .... (прозрачные расширения класса с eval
читайте ниже для получения дополнительной информации ...).
p.s статический вызов нестатических методов - это неправильно и не должен быть разрешен - если вы установите error_reporting(E_ALL | E_STRICT)
(как вы должны делать во время разработки), вы увидите ошибку, возникающую.
В основном происходит следующее:
В ядре есть файл с именем:
class Controller_Core {
public function someMethod(){}
}
Вы создаете:
// We can use someMethod of Controller_Core
Index_Controller extends Controller {}
Это действительно расширение Controller_Core
ЕСЛИ вы создали MY_Controller.php, который будет class Controller extends Controller_Core
.
//MY_Controller.php
class Controller extends Controller_Core
{
// overloads Controller_Core::someMethod without us having to change the core file
public function someMethod(){}
}