Используя $this, сам:: родитель:: для удобочитаемости кода

Установка, ТОЛЬКО ДЛЯ ЧТЕНИЯ на виджете только, делает вход в браузере только для чтения. Добавление clean_sku, который возвращает instance.sku, гарантирует, что значение поля не изменится на уровне формы.

def clean_sku(self):
    if self.instance: 
        return self.instance.sku
    else: 
        return self.fields['sku']

Этот способ, которым можно использовать модель (неизмененное сохранение) и постараться не получать поле, потребовал ошибки.

10
задан superjadex12 16 July 2009 в 11:29
поделиться

6 ответов

Контроллеры не являются статическими в 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(){}
}
6
ответ дан 3 December 2019 в 18:00
поделиться

Есть разница.

$ this относится к экземпляру объекта.

parent и self используются для вызова методы статически.

Эта страница руководства по PHP объясняет это более подробно, чем у меня есть время написать на данный момент. В частности, первый пример должен помочь выделить некоторые различия. Я рекомендую вам скопировать и вставить первый пример и возиться с ним, так как я думаю, что это важная идея, которую нужно запомнить, если вы еще не знаете разницы.

16
ответ дан 3 December 2019 в 18:00
поделиться

Я думаю, что self :: обычно используется для статических функций и свойств.

Я использую Kohana, и, возможно, контроллеры сделаны статическими.

0
ответ дан 3 December 2019 в 18:00
поделиться

Я не мог добавить комментарий (видимо, у меня нет требуемая репутация!)

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);

0
ответ дан 3 December 2019 в 18:00
поделиться

I strictly use self:: only for static variables and static member function

0
ответ дан 3 December 2019 в 18:00
поделиться

Еще одна вещь, которую следует отметить, кстати, это то, что это не очень хороший дизайн 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);
0
ответ дан 3 December 2019 в 18:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: