Установка, ТОЛЬКО ДЛЯ ЧТЕНИЯ на виджете только, делает вход в браузере только для чтения. Добавление clean_sku, который возвращает instance.sku, гарантирует, что значение поля не изменится на уровне формы.
def clean_sku(self):
if self.instance:
return self.instance.sku
else:
return self.fields['sku']
Этот способ, которым можно использовать модель (неизмененное сохранение) и постараться не получать поле, потребовал ошибки.
Контроллеры не являются статическими в Kohana, хотя они могут содержать статические переменные / методы-члены или константы.
self ::
- это сокращенный способ записи ] ClassName ::
ie
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
подробнее читайте ниже ...).
ps вызов нестатических методов статически неверно и не должно быть разрешено - если вы установите 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, который был бы Контроллер класса расширяет 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(){}
}
Есть разница.
$ this
относится к экземпляру объекта.
parent
и self
используются для вызова методы статически.
Эта страница руководства по PHP объясняет это более подробно, чем у меня есть время написать на данный момент. В частности, первый пример должен помочь выделить некоторые различия. Я рекомендую вам скопировать и вставить первый пример и возиться с ним, так как я думаю, что это важная идея, которую нужно запомнить, если вы еще не знаете разницы.
Я думаю, что self :: обычно используется для статических функций и свойств.
Я использую Kohana, и, возможно, контроллеры сделаны статическими.
Я не мог добавить комментарий (видимо, у меня нет требуемая репутация!)
class Forum_Controller extends Controller {
public function __construct()
{
parent::__construct();
}
public function index()
{
echo self::categories();
}
/*
* get a list of categories from a specific site.
*/
private static function categories()
{
$db = new Database;
// You cannot use $this in a static function, because static functions are per class
// and not per object it doesnt know what $this is :) (make private static $site_id and use self::$site_id) if this is what you want
$categories = $db->query("
SELECT * FROM
forum_categories
WHERE fk_site = '$this->site_id'
");
$view = new View('categories_view');
$view->categories = $categories;
return $view;
}
}
Как я уже сказал, вы должны использовать error_reporting (E_ALL | E_STRICT);
I strictly use self:: only for static variables and static member function
Еще одна вещь, которую следует отметить, кстати, это то, что это не очень хороший дизайн MVC для создания статических функций контроллера, которые возвращают списки категорий.
Контроллеры предназначены для работы с запросами, Модели предназначены для работы с данными (вот что это такое), а представления предназначены для отображения.
создайте модель!
class Category_Model extends Model
{
public function categories($site_id)
{
$categories = $this->db->from('forum_categories')->where('fk_site',$site_id)->get();
return new View('categories_view', array('categories' => $categories));
}
}
...
$cat = new Category_Model;
echo $cat->categories(1);