КОнтакты, предложения, отзывы

.rar или .zip
Вложение
Онлайн-чат
На этом сайте, вы найдёте полезную информацию, практические советы в области веб-программирования, веб-дизайна и веб-разработок в целом. Мы с удовольствием поделимся с вами реальными примерами и решениями задач, связанных с jQuery , JavaScript , PHP и MySQL , версткой сайтов , поможем разобраться новичкам с современными технологиями, такими как Ajax , HTML5 , CSS3 и многими другими.

Namespaces

Здравствуйте! В этой статье будут рассмотрены следующие темы:
Пространства имён: начиная с версии PHP 5.3 вы можете инкапсулировать элементы кода в самостоятельные ячейки.
Пути включения файлов: позволяют указать места централизованного хранения библиотечного кода.
Автозагрузка: поиск файлов с именами, совпадающими с именами классов

Пространства имён

Что же такое пространство имён? по существу - это корзина, в которую вы можете поместить классы, функции и переменные. В пределах одного пространства имён вы можете обращаться к ним без всякого уточнения. Чтобы обратиться к этим элементам за пределами пространства имён, вам придётся либо импортировать в код цлое пространство имён, либо использовать ссылку на него.
namespace sash;
require_once 'useful/Outputter2.php';
class Outputter{
  // вывод данных
}

// useful/Outputter2.php
namespace useful;
class Outputter{
  // 
}
В этом случае никакого конфликта имён не произойдёт. При использовании пространств имён в коде их обьявление должно быть выполнено в первом операторе в файле. Обычно в программах испольуются более длинные пространства имён. Как правило, они начинаются с названия организации или проекта, а далее указывается название пакета. В php допускаются вложенные пространства имён. Для разделения их на уровни используется символ обратной косой черты \ , как показано ниже
namespace ru\web4myself\util;
class Sash{
  static function hello(){
    echo "Привет из класса Sash <br>";
  }
}
Здесь я пешил воспользоваться именем своего домена как собственным пространством имён. После создания собственного хранилища кода я должен опредеить помещаемые в него пакеты. В данном случае после имени домена я использовал ключевое слово util.
Теперь если я вызываю метод из текущего пространства имён, всё происходит как и раньше, т.е. метод вызывается напрямую
Sash::hello();
Другое дело, если нам нужно вызвать метод за пределами текущего пространства имён. Тогда нужно указать следующее:
namespace other;
\ru\web4myself\util\Sash::hello();
Начальный символ \ говорит интерпретатору, что поиск классов нужно начинать не стекущего пространства имён, а с корня.
Можно упростить, создать псевдонимы других пространств имён в текущем пространстве:
namespace other;
use ru\web4myself\util;

util\Sash::hello();
при этом импортируется пространство имён ru\web4myself\util и ему неявно назначается псевдоним util. обратите внимание на то, что перед его названием я не использую символ \. Всё дело в том, что поиск указанного после ключевого слова use пространства имён выполняется из глобального контекста. Если из нового пространства имён мне нужен только класс Sash, я могу импортировать только его, а не всё пространство:
namespace other;
use ru\web4myself\util\Sash;

Sash::hello();
если в пространстве other уже определён другой класс Sash, необходимо указывать псевдоним класса:
namespace other;
use ru\web4myself\util\Sash as mainSash;

class Sash{
  static function hello(){
    echo "Привет из класса other\Sash <br>";
  }
}

mainSash::hello();
Если вы пишете код в текущем пространстве имён и хотите обратиться к классу, находящемуся в глобальном (без имени) пространстве, просто укажите перед его именем обратную косую черту.
// global.php: пространство имён не используется
class Lister{
  public static function hello(){
    // константа __NAMESPACE__ содержит имя текущего пространства имён, что может очень пригодиться при отладке кода:
    echo "Привет из " . __NAMESPACE__ . "<br>";
  }
}

// local.php:
namespace ru\web4myself\util;
require_once 'global.php';

class Lister{
  public static function hello(){
    echo "Привет из " . __NAMESPACE__ . "<br>";
  }
}

Lister::hello(); // доступ к локальному классу
\Lister::hello(); // доступ к глобальному классу
Можно также использовать альтернативный синтаксис определения пространства имён, в котором используются фигурные скобки:
namespace{ // глобальное пространство
  class main{
     //
  }
}

namespace ru\web4myself\util{
  class main{
    static function hello(){
        echo "Привет из класса other\Sash <br>";
    }
  }
}

namespace other{
  \ru\web4myself\util\main::hello();
}
Если приходится обьединять несколько пространств имён в одном файле, то второй синтаксис предпочтительнее. Хотя обычно рекомендуется в одном файле определять только одно пространство.

Пути включения файлов

Ни использование относительных, ни абсолютных путей включения файлов не является идеальным решением. Включаемые библиотеки должны работать из любой точки файловой системы. Это можно сделать, поместив пакет в один из каталогов, перечисленных в директиве include_path. Она обычно определяется в главном файле конфигурации PHP php_ini. В нём определяется список каталогов, разделённых двоеточием (в UNIX-подобных системах) или точкой с запятой (в системе Windows). Если вы используете сервер Apache, то директиву include_path можно указать или в файле .htaccess, или непосредственно из сценария:
// для .htaccess
php_value include_path value .:/usr/local/lib/php_libraries

/* для index.php */
// для того чтобы не затереть уже определённые значения
$path =  $_SERVER["DOCUMENT_ROOT"].'/php_libraries';// или
$path = __DIR__ . '/php_libraries';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);// или
ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . $path);    
После указания пути включения и неабсолютного пути файла в функциях, обращающихся к файловой системе, таких как fopen() или require(), если файл не находится в иерархии текущего рабочего каталога, автоматически выполняется его поиск в каталогах, включенных в путь поиска начиная с первого в списке. Поэтому, помещая пакет во включаемый каталог, достаточно будет указать название пакета и имя файла.

Автозагрузка

В некоторых ситуациях вам может понадобиться так организовать классы, чтобы определение каждого из них находилось в отдельном файле. Подобный вид организации может быть очень полезным, особенно при расширении системы, когда новые классы должны включаться во время выполнения программы. В таких случаях можно связать имя класса с именем файла. Например, мы можем определить класс ShopProduct в файле с именем ShopProduct.php. С другой стороны, при использовании соглашения PEAR, для этого класса, скорее всего, было бы выбрано имя в соответствии с назначением пакета - business_ShopProduct.php.
В PHP 5 введена функция-перехватчик __autoload(), помогающая автоматизировать включение файлов классов. Ей передаётся один строковый аргумент. Когда интерпретатор PHP сталкивается с попыткой создания экземпляра неизвестного класса, он вызывает функцию __autoload() (если она определена), передавая ей имя класса в качестве аргумента. От программиста зависит, как оон определит стратегию обнаружения и включения недостающего файла.
Пример функции __autoload():
function __autoload($classname){
  if(preg_match('/\\\\/', $classname)){
    $path = str_replace('\\', DIRECTORY_SEPARATOR, $classname);
}else{
    $path = str_replace('_', DIRECTORY_SEPARATOR, $classname);
  }
  require_once("$path.php");
}
Здесь предполагается, что классы, имена которых связаны с пространствами имён, располагаются в одноимённых файлах, находящихся в каталогах файловой системы. Кроме того, эта функция распознаёт систему именования классов, принятую в пакетах PEAR. Хорошая новость состоит в том, что значение, которое передаётся функции __autoload(), всегда нормализовано и содержит полностью определённое имя класса без символа обратной косой черты в начале.
В зависимости от способа организации классов и файлов, функция __autoload() может с учпехом использоваться для управления включениями библиотечных файлов.
P.S. Функция __autoload() является довольно мощным средством, но у неё есть свои ограничения. В частности, эта функция может быть определена в проекте только один раз. Если вы хотите динамически изменить __autoload() во время выполнения программы, используйте функцию spl_autoload_register(), с помощью которой это можно сделать.
2015.09.01 69

Российские программисты создали аналог известной программы "Окей, Google!" под названием "Окей, Х*й!", потому что в России последний знает намного больше, чем Google
Войдите или Зарегистрируйтесь чтобы оставить комментарий

Комментарии


    Яндекс.Метрика Яндекс.Метрика