Phar — удобные архивы исходного кода для php

Владимир Рочев

Веб-разработчик

Phar — удобные архивы исходного кода для php

Хорошо, когда свой код можно разбить на библиотеки и использовать его в разных проектах. Ещё лучше, когда эта библиотека представляет из себя архив, который легко переносится между директориями и проектами. Начиная с версии php 5.3 библиотека phar входит в стандартную поставку.

Вступление

PHP Archive (phar) — расширение, позволяющее хранить несколько php файлов в одном. Можно провести аналогию с JAR-файлов Java. Плюсы такого подхода очевидны:

  • экономия как физического места, так и визуального;
  • высокая скорость передачи файла по сети (если это надо).

Рассмотрим создание архива на примере человека и игрушек. Структура тестовой директории будет выглядеть следующим образом:


├── classes/
│   ├── ball.php
│   ├── car.php
│   ├── index.php
│   ├── person.php
│   ├── playable.php
│   └── toy.php
├── index.php
├── mylib.phar
└── setup.php

В директории classes/ будут располагаться те файлы, которые следует включить в архив.

Описание файлов:

  • index.php — файл для тестирования phar-архива;
  • setup.php — скрипт создания архива;
  • mylib.phar — сам архив
  • classes/playable.php — интерфейс объекта, которым можно играть;
  • classes/toy.php — абстрактный класс игрушки, реализующий общие методы;
  • classes/ball.php — класс мячика, в констукторе которого задаём радиус;
  • classes/car.php — класс машинки, у которой можно изменять цвет;
  • classes/person.php — класс человека;
  • classes/index.php — bootstrap-файл.

Исходные коды

Примечание:  для того, чтобы с помощью php создавать архивы, нужно или в php.ini прописать phar.readonly = Off, или в самом скрипте ini_set("phar.readonly", 0);

index.php

<?

header("Content-Type: text/plain");

require_once "mylib.phar";

$person = new Person("John");
$person->introduce();

$ball = new Ball(15);
$ball->printProperty();

$car = new Car("red");
$car->printProperty();

$person->play($ball);
$person->play($car);

setup.php

<?

$phar = new Phar("mylib.phar");
$phar->buildFromDirectory("classes/");

classes/playable.php

<?

interface Playable {

    public function getName();
    public function printProperty();
}

classes/toy.php

<?

abstract class Toy implements Playable {

    public function getName() {
        return get_called_class();
    }
}

classes/ball.php

<?

class Ball extends Toy {

    private $radius;

    public function __construct($radius = 10) {
        $this->radius = $radius;
    }

    public function printProperty() {
        echo "The radius of " . $this->getName() . " is " . $this->radius . PHP_EOL;
    }
}

classes/car.php

<?

class Car extends Toy {

    private $color;

    public function __construct($color = "blue") {
        $this->color = $color;
    }

    public function printProperty() {
        echo "The color of " . $this->getName() . " is " . $this->color . PHP_EOL;
    }
}

classes/person.php

<?

class Person {

    private $name;

    public function __construct($name = "Noname") {
        $this->name = $name;
    }

    public function introduce() {
        echo "Hello. My name is " . $this->name . "." . PHP_EOL;
    }

    public function play(Playable $object) {
        echo $this->name . " playing with " . $object->getName() . PHP_EOL;
    }
}

classes/index.php

<?

if (strtolower(pathinfo(__FILE__, PATHINFO_EXTENSION)) == 'phar') {
    Phar::mapPhar();
    spl_autoload_register(function ($class) {
        if (file_exists($filename = "phar://" . strtolower($cass) . ".php")) {
            include_once $filename;
        }
    });
} else {
    spl_autoload_register(function ($class) {
        if (file_exists($filename = __DIR__ . "/" . strtolower($class) . ".php")) {
            include_once $filename;
        }
    });
}

Результат

После того, как мы создали архив и подключили его в тестовом файле, на экране отобразился следующий текст:

Hello. My name is John.
The radius of Ball is 15
The color of Car is red
John playing with Ball
John playing with Car

Похожие посты

Мы подобрали посты, которые могут быть вам интересны

Комментарии

Тут без вас никак. Поделитесь с нами вашими мыслями

Горячие вакансии