Using $this, self::, parent:: for code readability
coding-style, kohana, php
Solution
Controllers are not static in Kohana, although they can contain static member variables / methods or constants.
`self::` is a shorthand way of writing `ClassName::` i.e
class Animal
{
public static $arms = 0;
}
class Dog extends Animal
{
public static $leg = 0;
const NAME = 'dog';
public static function bark()
{
echo 'Woof';
}
}
To call static functions or get constants from a class we use the scope resolution operator `::`. Static functions are per class not per object. Saying `::` refers to static instances of a class is wrong, it is just a way to access the static methods - there isn't an object instance that has these methods.
so:
Dog::bark(),
Dog::$leg,
Dog::NAME,
we can also use
Animal::$arms
Inside the class Dog we can use `self::` and `parent::` so that we do not need to type the full class name (as it could be very long!)
In answer to your question though: No - `self::` is not deprecated and no it is not bad practice to use it. The reason it is not used in kohana core is for a very different reason.... (transparent class extensions with `eval` read below for more info...).
p.s calling non-static methods statically is wrong and shouldn't be allowed- if you set `error_reporting(E_ALL | E_STRICT)` (like you should during development) you will see an error being raised.
Basically what happens is:
Core has a file called:
class Controller_Core {
public function someMethod(){}
}
You create:
// We can use someMethod of Controller_Core
Index_Controller extends Controller {}
This is really extending `Controller_Core` UNLESS you have created MY_Controller.php which would be `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(){}
}
Problem
I would like to know if it is acceptable/preferred to use self::method() and parent::method() when working in php classes. You can use $this->method() but $this-> can also refer to a class variable, a parent class variable, or a method from the parent class. There is no ambiguity in self:: Is self:: depreciated and/or are there any caveats or cons to using this style? I understand that self:: and parent:: refer to a static instance of the class, but in kohana, unless you specifically define a method as static, there does not seem to be a difference. Thanks. Added an example: Assuming this application stores forums from multiple websites... ``` class Forum_Controller extends Controller { function __construct() { parent::__construct(); } function index() { echo self::categories(); } /* * get a list of categories from a specific site. */ private function categories() { $db = new Database; $categories = $db->query(" SELECT * FROM forum_categories WHERE fk_site = '$this->site_id' "); $view = new View('categories_view'); $view->categories = $categories; return $view; } } ``` This examples works in kohana with error reporting set to: error_reporting(E_ALL & ~E_STRICT); $this->site_id is defined in the main Controller_Core class (a library in kohana). As far as I know, $this is not supposed to be available since I am calling self::categories() in a static manner, but it is only when i define categories() as static that it throws an error. But as I said I much rather prefer using self:: because from a readability perspective, I know exactly where this function should be, rather than using $this which causes ambiguity, to me that is.