This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
khosb/includes/kohana/modules/userguide/guide/ru-ru/using.autoloading.md
2011-05-03 09:49:01 +10:00

5.5 KiB
Raw Blame History

Загрузка классов

Kohana использует все преимущества автозагрузки в PHP. Это позволяет не использовать вызовы include или require перед использованием класса. К примеру, когда Вы хотите использовать метод [Cookie::set], Вы всего лишь вызываете:

Cookie::set('mycookie', 'any string value');

А для получения объекта [Encrypt] просто используйте [Encrypt::instance]:

$encrypt = Encrypt::instance();

Классы загружаются с помощью метода [Kohana::auto_load], который осуществляет простое преобразование из имени класса в имя файла:

  1. Классы располагаются в директории classes/ файловой системы
  2. Все знаки подчеркивания заменяются слэшами
  3. Имена файлов должны быть в нижнем регистре

Когда вызывается класс, который еще не был загружен (например Session_Cookie), Kohana будет искать файл под именем classes/session/cookie.php в файловой системе, с помощью [Kohana::find_file].

Собственные загрузчики

Системный загрузчик добавляется в файле application/bootstrap.php через вызов spl_autoload_register:

spl_autoload_register(array('Kohana', 'auto_load'));

Теперь [Kohana::auto_load] будет пытаться загрузить любой несуществующий класс при его первом использовании.

Прозрачное расширение классов

Каскадная файловая система поддерживает прозрачное расширение классов. Например, класс [Cookie] определен в SYSPATH/classes/cookie.php так:

class Cookie extends Kohana_Cookie {}

Системные классы Kohana, как и многие модули, используют такое определение, так что практически все классы могут быть расширены. Это делается прозрачно для системы, создайте свой класс в APPPATH/classes/cookie.php для добавления собственных методов.

[!!] Никогда не изменяйте файлы дистрибутива Kohana. Всегда вносите изменения в классы, используя расширения, так Вы избавитесь от головной боли при обновлении.

К примеру, Вы хотите создать метод, который устанавливает зашифрованную куку с помощью класса [Encrypt]:

<?php defined('SYSPATH') or die('No direct script access.');

class Cookie extends Kohana_Cookie {

    /**
     * @var  mixed  default encryption instance
     */
    public static $encryption = 'default';

    /**
     * Sets an encrypted cookie.
     *
     * @uses  Cookie::set
     * @uses  Encrypt::encode
     */
     public static function encrypt($name, $value, $expiration = NULL)
     {
         $value = Encrypt::instance(Cookie::$encrpytion)->encode((string) $value);

         parent::set($name, $value, $expiration);
     }

     /**
      * Gets an encrypted cookie.
      *
      * @uses  Cookie::get
      * @uses  Encrypt::decode
      */
      public static function decrypt($name, $default = NULL)
      {
          if ($value = parent::get($name, NULL))
          {
              $value = Encrypt::instance(Cookie::$encryption)->decode($value);
          }

          return isset($value) ? $value : $default;
      }

} // End Cookie

Теперь вызов Cookie::encrypt('secret', $data) будет создавать шифрованную куку, которую можно расшифровать так: $data = Cookie::decrypt('secret').

Многоуровневое расширение

Если Вы расширяете классы Kohana в модуле, следует поддерживать прозрачное расширение. Вместо того, чтобы наследовать расширение [Cookie] от [Kohana_Cookie], создайте MODPATH/mymod/encrypted/cookie.php:

class Encrypted_Cookie extends Kohana_Cookie {

    // Используйте методы encrypt() and decrypt(), описанные выше

}

Теперь создайте MODPATH/mymod/cookie.php:

class Cookie extends Encrypted_Cookie {}

Таким образом, пользователи смогут добавлять свои расширения в класс [Cookie], не затрагивая Ваши изменения. Однако, при следующем расширении класса [Cookie] придется наследоваться от Encrypted_Cookie, а не от Kohana_Cookie.