Жонглируем версиями PHP в системе

Что такое пространство имён?

Пространство имён определяет область кода, в которой гарантируется уникальность всех идентификаторов. По умолчанию, глобальные переменные и обычные функции определены в глобальном пространстве имён. Например:

int g_z = 4;

int boo(int z)
{
return -z;
}

1
2
3
4
5
6

intg_z=4;

intboo(intz)

{

return-z;

}

Глобальная переменная и функция boo() определены в глобальном пространстве имён.

В примере выше, при подключении файлов boo.h и doo.h, обе версии doOperation() были включены в глобальное пространство имён, из-за чего и, собственно, произошёл конфликт имён.

Чтобы избежать подобных ситуаций, когда два независимых объекта имеют идентификаторы, которые могут конфликтовать друг с другом при совместном использовании, C++ позволяет объявлять собственные пространства имён через ключевое слово namespace. Всё, что объявлено внутри пользовательского пространства имён, принадлежит только этому пространству имён (а не глобальному).

Перепишем заголовочные файлы с примера выше, но уже с использованием namespace:

boo.h:

namespace Boo
{
// Эта версия doOperation() принадлежит пространству имён Boo
int doOperation(int a, int b)
{
return a + b;
}
}

1
2
3
4
5
6
7
8

namespaceBoo

{

// Эта версия doOperation() принадлежит пространству имён Boo

intdoOperation(inta,intb)

{

returna+b;

}

}

doo.h:

namespace Doo
{
// Эта версия doOperation() принадлежит пространству имён Doo
int doOperation(int a, int b)
{
return a — b;
}
}

1
2
3
4
5
6
7
8

namespaceDoo

{

// Эта версия doOperation() принадлежит пространству имён Doo

intdoOperation(inta,intb)

{

returna-b;

}

}

Теперь doOperation() из файла boo.h находится в пространстве имён , а doOperation() из файла doo.h — в пространстве имён . Посмотрим, что произойдёт при перекомпиляции main.cpp:

int main()
{
std::cout

1
2
3
4
5

intmain()

{

std::coutdoOperation(5,4);// какая версия doOperation здесь выполнится?

return;

}

Результатом будет ещё одна ошибка:

Случилось так, что когда мы попытались вызвать функцию doOperation(), компилятор заглянул в глобальное пространство имён в поисках определения doOperation(). Однако, поскольку ни одна из наших версий doOperation() не находится в глобальном пространстве имён, компилятор не смог найти определение doOperation() вообще!

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

Конфликт имён в C++

Допустим, что вам нужно съездить к дальним родственникам в другой город. У вас есть только их адрес: г. Ржев, ул. Вербовая, 13. Попав в город Ржев, вы открываете Google Карты/Яндекс.Карты и видите, что есть две улицы с названием «Вербовая», ещё и в противоположных концах города! Какая из них нужна вам? Если у вас нет никакой дополнительной информации (например, вы знаете, что их дом находится возле аптеки или школы), вам придётся позвонить им и спросить. Чтобы подобной путаницы не возникало, все названия улиц в городе должны быть уникальными.

Аналогично и в C++, все идентификаторы (имена переменных/функций/классов и т.д.) должны быть уникальными. Если в вашей программе находятся два одинаковых идентификатора, то будьте уверены, ваша программа не скомпилируется: вы получите ошибку конфликта имён.

Пример конфликта имён:

a.cpp:

#include

void doSomething(int x)
{
std::cout

1
2
3
4
5
6

#include

voiddoSomething(intx)

{

std::coutx;

}

b.cpp:

#include

void doSomething(int x)
{
std::cout

1
2
3
4
5
6

#include

voiddoSomething(intx)

{

std::coutx *2;

}

main.cpp:

void doSomething(int x); // предварительное объявление функции doSomething

int main()
{
doSomething(5);

return 0;
}

1
2
3
4
5
6
7
8

voiddoSomething(intx);// предварительное объявление функции doSomething

intmain()

{

doSomething(5);

return;

}

По отдельности файлы a.cpp, b.cpp и main.cpp скомпилируются. Однако, если a.cpp и b.cpp разместить в одном проекте — произойдёт конфликт имён, так как определение функции doSomething() находится сразу в обоих файлах.

Большинство конфликтов имён происходят в двух случаях:

  Файлы, добавленные в один проект, имеют функцию (или глобальную переменную) с одинаковыми именами (ошибка на этапе линкинга).

   Файл .cpp подключает заголовочный файл, в котором идентификатор конфликтует с идентификатором из файла .cpp (ошибка на этапе компиляции).

Как только программы становятся больше — используется больше идентификаторов. Следовательно, вероятность возникновения конфликта имён значительно возрастает. Хорошая новость заключается в том, что C++ предоставляет достаточно механизмов для предотвращения возникновения конфликтов имён (например: локальная область видимости или пространства имён).

Сравнение типов и режимов пространств именComparing namespace types and modes

В следующей таблице приведены характеристики каждого типа и режима пространств имен.The characteristics of each namespace type and mode are described in the following table.

ХарактеристикаCharacteristic Изолированное пространство именStand-Alone Namespace Доменное пространство имен (режим Windows 2000 Server)Domain-based Namespace (Windows 2000 Server Mode) Доменное пространство имен (режим Windows 2008 Server)Domain-based Namespace (Windows Server 2008 Mode)
Путь к пространству именPath to namespace \\ сервернаме\рутнаме\\ ServerName\RootName \\ нетбиосдомаиннаме\рутнаме\\ NetBIOSDomainName\RootName \\ днсдомаиннаме\рутнаме\\ DNSDomainName\RootName \\ нетбиосдомаиннаме\рутнаме\\ NetBIOSDomainName\RootName \\ днсдомаиннаме\рутнаме\\ DNSDomainName\RootName
Место хранения информации пространства именNamespace information storage location В реестре и в кэш-памяти на сервере пространства именIn the registry and in a memory cache on the namespace server В AD DS и в кэш-памяти на каждом сервере пространства именIn AD DS and in a memory cache on each namespace server В AD DS и в кэш-памяти на каждом сервере пространства именIn AD DS and in a memory cache on each namespace server
Рекомендуемые размеры пространства именNamespace size recommendations Пространство имен может содержать более 5000 папок с конечными объектами; рекомендуемое ограничение — 50 000 папок с конечными объектамиThe namespace can contain more than 5,000 folders with targets; the recommended limit is 50,000 folders with targets Размер объекта пространства имен в AD DS должен быть менее 5 мегабайт (МБ) для поддержания совместимости с контроллерами домена, которые работают не под управлением Windows Server 2008.The size of the namespace object in AD DS should be less than 5 megabytes (MB) to maintain compatibility with domain controllers that are not running Windows Server 2008. Это означает не более 5000 (приблизительно) папок с конечными объектами.This means no more than approximately 5,000 folders with targets. Пространство имен может содержать более 5000 папок с конечными объектами; рекомендуемое ограничение — 50 000 папок с конечными объектамиThe namespace can contain more than 5,000 folders with targets; the recommended limit is 50,000 folders with targets
Минимальный режим работы леса AD DSMinimum AD DS forest functional level AD DS не требуетсяAD DS is not required Windows 2000Windows 2000 Windows Server 2003Windows Server 2003
Минимальный режим работы домена AD DSMinimum AD DS domain functional level AD DS не требуетсяAD DS is not required Windows 2000 (смешанный режим)Windows 2000 mixed Windows Server 2008Windows Server 2008
Минимальные поддерживаемые серверы пространства именMinimum supported namespace servers Windows 2000 ServerWindows 2000 Server Windows 2000 ServerWindows 2000 Server Windows Server 2008Windows Server 2008
Поддержка перечисления на основе доступа (если включено)Support for access-based enumeration (if enabled) Да, требуется сервер пространства имен Windows Server 2008Yes, requires Windows Server 2008 namespace server НетNo ДаYes
Поддерживаемые методы обеспечения доступности пространства именSupported methods to ensure namespace availability Создание изолированного пространства имен в отказоустойчивом кластере.Create a stand-alone namespace on a failover cluster. Использование нескольких серверов пространства имен для размещения пространства имен.Use multiple namespace servers to host the namespace. (Серверы пространства имен должны находиться в одном и том же домене.)(The namespace servers must be in the same domain.) Использование нескольких серверов пространства имен для размещения пространства имен.Use multiple namespace servers to host the namespace. (Серверы пространства имен должны находиться в одном и том же домене.)(The namespace servers must be in the same domain.)
Поддержка использования репликации DFS для репликации конечных объектов папокSupport for using DFS Replication to replicate folder targets Поддерживается при присоединении к домену AD DSSupported when joined to an AD DS domain ПоддерживаетсяSupported ПоддерживаетсяSupported

Операторы

Объединяет объект XNamespace с локальным именем для создания XName.Combines an XNamespace object with a local name to create an XName.

Возвращает значение, указывающее, равны ли два экземпляра XNamespace.Returns a value indicating whether two instances of XNamespace are equal.

Преобразует строку, содержащую Uniform Resource Identifier (URI), в XNamespace.Converts a string containing a Uniform Resource Identifier (URI) to an XNamespace.

Возвращает значение, указывающее, являются ли два экземпляра XNamespace неравными.Returns a value indicating whether two instances of XNamespace are not equal.

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

В первых версиях C++ все идентификаторы из стандартной библиотеки C++ (такие как cin/cout и т.д.) можно было использовать напрямую. Тем не менее, это означало, что любой идентификатор из стандартной библиотеки С++ потенциально мог конфликтовать с именем, которое вы выбрали для ваших собственных идентификаторов. Код, который работал, мог внезапно получить конфликт имён при подключении нового заголовочного файла из стандартной библиотеки С++. Или, что ещё хуже, код, написанный по стандартам одной версии С++, мог уже не работать в новой версии С++. Чтобы решить эту проблему, весь функционал стандартной библиотеки С++ перенесли в специальную область — пространство имён (англ. «namespace»).

Так как город гарантирует, что все улицы в его пределах имеют уникальные имена, так и пространство имён гарантирует, что все его идентификаторы — уникальны.

Таким образом, std::cout состоит из двух частей: идентификатор cout и пространство имён std. Весь функционал стандартной библиотеки C++ определён внутри пространства имён (сокращенно от англ. «standard»).

Мы ещё поговорим о пространствах имён в следующих уроках, а также расскажем, как создать свой собственный namespace. Сейчас, главное, что вам нужно запомнить — всякий раз, когда вы используете идентификаторы из стандартной библиотеки С++ (например, cout), вы должны сообщать компилятору, что этот идентификатор находится внутри пространства имён std.

Правило: При использовании идентификаторов из пространств имён — указывайте используемые пространства имён.

Конструкции возврата значений генератора

Теперь допускается использование языковой конструкции «return» в генераторе для возврата финального значения (возвращение значений с использованием ссылок не допускается). Финальное значение извлекается с помощью метода newGenerator::getReturn(). Генератор вернет значение после завершения возвращающих операций.

Результат:

Явный возврат финального значения генератора позволяет обрабатывать значение непосредственно в коде, вызывающем генератор. Это гораздо проще, чем проверять, является ли каждое возвращенное значение финальным, чтобы обработать его отдельно. 

Что такое пространство имён в PHP 5

Значит, как для полных дэбилов, опять же только в хорошем смысле этого слова, скажем, что пространства имён в PHP 5 (да и в С и С++) — это как имена городов России или Украины, которые содержат в себе имена улиц. Например в одном и том же городе, как и в пространстве имён, Москва к примеру, не может существовать несколько названий улиц с именем «Путлеровская 666» — согласны? Ок.

Кроме определяемых пространств имён существует ещё и глобальное пространство имён PHP, в котором тусуются все базовые функции и классы, а также те, которые были определены в подключаемых файлах и которым не было назначено определённое пространство имён. По анологии с реальной жизнью можно сказать, что бомжи, гопники, проститутки и другие приблуды по сути являются теми же функциями и классами, которым не было назначено определённое место жительства (пространство имён) и которые живут просто в глобальном пространстве России, — ака «мой адрес не дом и не улица, мой адрес советский союз».

Working with Namespaces

Creation and deletion of namespaces are described in the Admin Guide documentation
for namespaces.

Viewing namespaces

You can list the current namespaces in a cluster using:

Kubernetes starts with three initial namespaces:

  • The default namespace for objects with no other namespace
  • The namespace for objects created by the Kubernetes system
  • This namespace is created automatically and is readable by all users (including those not authenticated). This namespace is mostly reserved for cluster usage, in case that some resources should be visible and readable publicly throughout the whole cluster. The public aspect of this namespace is only a convention, not a requirement.

To set the namespace for a current request, use the flag.

For example:

Оператор «use»

В PHP 5.x, если нужно импортировать классы, функции и константы из пространства имен, необходимо использовать use несколько раз.

В PHP 7 это можно сделать, используя оператор use только один раз. В приведенном ниже примере мы сгруппировали классы, функции и константы, которые принадлежат к одному пространству имен, и поместили их в фигурные скобки, каждый из этих элементов разделен запятой:

Предназначение use

Основное предназначение использования PHP namespace use — помочь компилятору PHP определить, какой класс выполнять. Представим ситуацию, когда у нас есть два класса с одинаковым именем. Это может произойти, когда мы работаем с огромным структурным приложением MVC. Если у нас есть два класса с одинаковым именем, то нужно поместить их в различные пространства имен.

Предположим, что автозагрузчик загружает оба класса, и нам нужно создать объект одного класса. В этом случае компилятор не сможет определить, какой из двух классов с одинаковым именем загружать. Но можно использовать оператор use ООП PHP, чтобы помочь компилятору определить, какой класс загружать.

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

  • Внутри пространства имен может содержаться любой код PHP. Если он предназначен для классов, интерфейсов, функций и констант, тогда код зависит от пространства имен;
  • Пространство имен всегда объявляется с помощью namespace. Если мы объявляем пространство имен в скрипте, то это объявление всегда должно размещаться в его начале. То есть выше всего остального PHP-кода, кроме declare;
  • Можно определить одно пространство имен в нескольких файлах. Это позволяет распределить содержимое пространства имен в файловой системе;
  • На пространство имен можно ссылаться, используя полное имя с псевдонимом, это также называется импортированием. Что эквивалентно функции создания символьных ссылок на директории или файлы в системах на основе UNIX;
  • Всеми версиями PHP поддерживаются три вида alias или импортирования. Псевдоним имени класса, псевдоним имени интерфейса и псевдоним имени пространства имен. Но версии PHP 5.6+ и 7 поддерживают aliasing или импортирование имен функций и констант;
  • use PHP как использовать: глобально или внутри объявления пространства имен. Глобальное объявление необходимо, так как импортирование производится во время компиляции, а не во время исполнения. Следовательно, оно не может быть заблокировано или ограничено локально;
  • Ниже приведен пример использования пространства имен в коде РНР:

Объяснение кода PHP

  • Пространство имен объявляется в верхней части кода PHP;
  • В том же файле мы объявляем константу, класс и функцию;
  • Мы можем импортировать эти элементы в другой файл с помощью оператора use ООП PHP.

Целочисленное деление

В PHP 7 была введена новая функция, которая выполняет целочисленное деление на значения, передаваемые в качестве аргументов, и возвращает результат деления в виде int (только целую часть).

Синтаксис функции:

intdiv (arg1, arg2)

Первый параметр является числителем, а второй параметр — делителем. Ниже приведен пример, который демонстрирует работу этой функции:

Объяснение кода PHP 7

  • Мы объявляем переменную $result, которая принимает результат функции intdiv (110, 30). Она принимает два параметра: первый параметр — числитель (110), а второй параметр – делитель (30);
  • Если мы выполним простое арифметическое действие, то получим 3,666 (округленное значение). Но поскольку это целочисленное деление, функция возвратит только 3, отбросив все значения после запятой;
  • Затем мы использовали функцию var_dump(), которая возвращает информацию о переменной. В нашем случае вы увидите тип данных переменной $result — Int, так как эта переменная содержит значение, возвращаемое функцией целочисленного деления;
  • Мы выводим значение, содержащееся в переменной $result — целая часть от результата деления 110 на 30.

Результат

Когда мы выполним эту программу в PHP 7, на экран будет выведен тип данных переменной $result — int, и значение 3:

Исходный код оператора и функции целочисленного деления

Заключение

В этой статье был рассмотрен оператор PHP use и применение новой функции целочисленного деления, которая была добавлена в PHP 7.

Данная публикация представляет собой перевод статьи «Learn How to Use Statement and Integer Division in PHP 7» , подготовленной дружной командой проекта Интернет-технологии.ру

Пространства имен, псевдонимы и статический импорт

Последнее обновление: 17.09.2019

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

Все определяемые классы и структуры, как правило, не существуют сами по себе, а заключаются в специальные контейнеры — пространства имен. Создаваемый по умолчанию
класс Program уже находится в пространстве имен, которое обычно совпадает с названием проекта:

namespace HelloApp
{  
    class Program  
    {
        static void Main(string[] args) 
        {
		}
	}
}

Пространство имен определяется с помощью ключевого слова namespace, после которого идет название. Так в данном случае полное
название класса Program будет HelloApp.Program.

Класс Program видит все классы, которые объявлены в том же пространстве имен:

namespace HelloApp
{  
    class Program  
    {
        static void Main(string[] args) 
        {
			 Account account = new Account(4);
		}
	}
	class Account
    {
        public int Id { get; private set;} // номер счета
        public Account(int _id)
        {
            Id = _id;
        }
	}
}

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

using System;
namespace HelloApp
{  
    class Program  
    {
        static void Main(string[] args) 
        {
			Console.WriteLine("hello");
		}
	}
}

Здесь подключается пространство имен System, в котором определен класс Console. Иначе нам бы пришлось писать полный путь к классу:

static void Main(string[] args) 
{
	System.Console.WriteLine("hello");
}

Пространства имен могут быть определены внутри других пространств:

using HelloApp.AccountSpace;
namespace HelloApp
{  
    class Program  
    {
        static void Main(string[] args) 
        {
            Account account = new Account(4);
        }
    }

    namespace AccountSpace
    {
        class Account
        {
            public int Id { get; private set;}
            public Account(int _id)
            {
                Id = _id;
            }
        }
    } 
}

В этом случае для подключения пространства указывается его полный путь с учетом внешних пространств имен:

Псевдонимы

Для различных классов мы можем использовать псевдонимы. Затем в программе вместо названия класса используется его псевдоним. Например,
для вывода строки на экран применяется метод . Но теперь зададим для класса Console псевдоним:

using printer = System.Console;
class Program
{
    static void Main(string[] args)
    {
        printer.WriteLine("Hello from C#");
        printer.Read();
    }
}

С помощью выражения указываем, что псевдонимом для класса System.Console будет имя . Это выражение
не имеет ничего общего с подключением пространств имен в начале файла, хотя и использует оператор . При этом используется полное имя класса
с учетом пространства имен, в котором класс определен. И далее, чтобы вывести
строку, применяется выражение .

И еще пример. Определим класс и для него псевдоним:

using Person = HelloApp.User;
using Printer = System.Console;
namespace HelloApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person();
            person.name = "Tom";
            Printer.WriteLine(person.name);
            Printer.Read();
        }
    }

    class User
    {
        public string name;
    }
}

Класс называется User, но в программе для него используется псевдоним Person.

Также в C# имеется возможность импорта функциональности классов. Например, импортируем возможности класса :

using static System.Console;
namespace HelloApp
{
    class Program
    {
        static void Main(string[] args)
        {
            WriteLine("Hello from C# 8.0");
            Read();
        }
    }
}

Выражение подключает в программу все статические методы и свойства, а также константы. И после этого мы можем
не указывать название класса при вызове метода.

Подобным образом можно определять свои классы и импортировать их:

using static System.Console;
using static System.Math;
using static HelloApp.Geometry;
namespace HelloApp
{
    class Program
    {
        static void Main(string[] args)
        {
            double radius = 50;
            double result = GetArea(radius); //Geometry.GetArea
            WriteLine(result); //Console.WriteLine
            Read(); // Console.Read
        }
    }

    class Geometry
    {
        public static double GetArea(double radius)
        {
            return PI * radius * radius; // Math.PI
        }
    }
}

НазадВперед

When to Use Multiple Namespaces

Namespaces are intended for use in environments with many users spread across multiple
teams, or projects. For clusters with a few to tens of users, you should not
need to create or think about namespaces at all. Start using namespaces when you
need the features they provide.

Namespaces provide a scope for names. Names of resources need to be unique within a namespace,
but not across namespaces. Namespaces can not be nested inside one another and each Kubernetes
resource can only be in one namespace.

Namespaces are a way to divide cluster resources between multiple users (via resource quota).

In future versions of Kubernetes, objects in the same namespace will have the same
access control policies by default.

It is not necessary to use multiple namespaces just to separate slightly different
resources, such as different versions of the same software: use labels to distinguish
resources within the same namespace.

Классы

CommonDialog

Абстрактный базовый класс для отображения общих диалоговых окон Win32.An abstract base class for displaying common Win32 dialogs.

FileDialog

Абстрактный базовый класс, инкапсулирующий функции, общие для диалоговых окон работы с файлами, включая OpenFileDialog и SaveFileDialog.An abstract base class that encapsulates functionality that is common to file dialogs, including OpenFileDialog and SaveFileDialog.

FileDialogCustomPlace

Представляет запись в списке пользовательских размещений FileDialog.Represents an entry in a FileDialog custom place list.

FileDialogCustomPlaces

Определяет известные папки для пользовательских размещений в диалоговых окнах открытия или сохранения файлов.Defines the known folders for custom places in file dialog boxes.

IntranetZoneCredentialPolicy

Определяет политику учетных данных, используемую для запросов, создаваемых с помощью WebRequest и соответствующих производных классов.Defines a credential policy to be used for resource requests that are made using WebRequest and its derived classes.

OpenFileDialog

Представляет общее диалоговое окно, позволяющее пользователю задать имя файла для одного или нескольких открываемых файлов.Represents a common dialog box that allows a user to specify a filename for one or more files to open.

PowerModeChangedEventArgs

Предоставляет данные для события PowerModeChanged.Provides data for the PowerModeChanged event.

Registry

Предоставляет объекты RegistryKey, представляющие корневые разделы в реестре Windows, и методы для доступа к парам «раздел-значение».Provides RegistryKey objects that represent the root keys in the Windows registry, and methods to access key/value pairs.

RegistryAclExtensions

RegistryKey

Представляет узел уровня раздела в реестре Windows.Represents a key-level node in the Windows registry. Этот класс является инкапсуляцией реестра.This class is a registry encapsulation.

SaveFileDialog

Представляет общее диалоговое окно, позволяющее пользователю задать имя файла, чтобы сохранить файл под другим именем.Represents a common dialog that allows the user to specify a filename to save a file as. Объект SaveFileDialog не может использоваться приложением, выполняемым с частичным доверием.SaveFileDialog cannot be used by an application that is executing under partial trust.

SessionEndedEventArgs

Предоставляет данные для события SessionEnded.Provides data for the SessionEnded event.

SessionEndingEventArgs

Предоставляет данные для события SessionEnding.Provides data for the SessionEnding event.

SessionSwitchEventArgs

Предоставляет данные для события SessionSwitch.Provides data for the SessionSwitch event.

SystemEvents

Предоставляет доступ к уведомлениям о системных событиях.Provides access to system event notifications. Этот класс не наследуется.This class cannot be inherited.

TimerElapsedEventArgs

Предоставляет данные для события TimerElapsed.Provides data for the TimerElapsed event.

UserPreferenceChangedEventArgs

Предоставляет данные для события UserPreferenceChanged.Provides data for the UserPreferenceChanged event.

UserPreferenceChangingEventArgs

Предоставляет данные для события UserPreferenceChanging.Provides data for the UserPreferenceChanging event.

Should a Line Break Before or After a Binary Operator?

For decades the recommended style was to break after binary operators.
But this can hurt readability in two ways: the operators tend to get
scattered across different columns on the screen, and each operator is
moved away from its operand and onto the previous line. Here, the eye
has to do extra work to tell which items are added and which are
subtracted:

# No: operators sit far away from their operands
income = (gross_wages +
          taxable_interest +
          (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)

To solve this readability problem, mathematicians and their publishers
follow the opposite convention. Donald Knuth explains the traditional
rule in his Computers and Typesetting series: «Although formulas
within a paragraph always break after binary operations and relations,
displayed formulas always break before binary operations» .

Following the tradition from mathematics usually results in more
readable code:

# Yes: easy to match operators with operands
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

Run the magic!

Мы набросали минимальную конфигурацию для локальной среды разработки и можем ее смело запускать. Для этого из корня нашей сборки, где лежит файл нужно выполнить команду и немного подождать. Первый запуск будет дольше, потому что docker’у нужно скачать образы и собрать образ для php.

В конце концов мы увидим заветные строчки:

Они говорят нам что наши три контейнера запущены и готовы к работе. Проверимс… Для этого откроем браузер и перейдем по адресу , но сперва добавим одну строку в файл.

Важно для windows и mac адрес 127.0.0.1 нужно заменить на адрес виртуальной машины, в которой запускается докер, потому что нативной поддержки пока нет или она очень унылая. Итак, окрываем браузер и видим:

Итак, окрываем браузер и видим:

Использованные образы:

  • PHP
  • Nginx
  • Mysql
Ссылка на основную публикацию