PHP: использование хинтинга типов (скалярные типы и возвращаемые типы) для экземпляров пространства имен - PullRequest
0 голосов
/ 19 октября 2018

Каков наилучший способ обработки объявлений скалярного типа и возвращаемого типа для экземпляров пространства имен?

Я использую классы пространства имен для всего и использую псевдонимы 'use' в верхней части класса для всех классов, которые будутиспользоваться в файле.

Это пример без использования скалярных объявлений типа и типа возвращаемого значения:

file 1

use Model\ExampleA\ClassA;
use Model\ExampleB\ClassB;

$classA = new ClassA();
$classB = new ClassB();
$result = $classB->action($classA);

file 2

namespace Model\ExampleB;

class ClassB
{
    /**
     * @param  ClassA $classA The ClassA instance.
     * @return ClassA         Returns the ClassA instance.
     */
    public function action($classA)
    {
        return $classA;
    }
}

Теперь при использованиискалярный тип и декларации возвращаемого типа, вместо file2 будет:

namespace Model\ExampleB;

use Model\ExampleA\ClassA;

class ClassB
{
    /**
     * @param  ClassA $classA The ClassA instance.
     * @return ClassA         Returns the ClassA instance.
     */
    public function action(classA $classA) : classA
    {
        return $classA;
    }
}

Так что если вы используете декларации скалярного или возвращаемого типа для экземпляров пространства имен, мне придется снова использовать псевдоним 'use' в верхней части file2 только длятип, намекающий на работу.

Я бы предпочел использовать тип данных «объект» для скалярного типа или тип возвращаемого значения для экземпляров с пространством имен и сохранить типы данных @param и @return в докблоке в качестве таких примеров, какэто:

namespace Model\ClassB;

class ClassB
{
    /**
     * @param  ClassA $classA The ClassA instance.
     * @return ClassA         Returns the ClassA instance.
     */
    public function action(object $classA) : object
    {
        return $classA;
    }
}

Это нормально?Или мой другой пример - лучший способ сделать это?

1 Ответ

0 голосов
/ 19 октября 2018

Я не совсем понимаю вашу проблему.

  1. Если оба класса (ClassA и ClassB) находятся в одном каталоге, нет необходимости использовать оператор use.

  2. Скалярный тип укажет вашему коллеге, что вашему методу нужен экземпляр этого класса.Это полезно, оно документирует ваш код и предотвращает ошибки.См. Это в качестве руководства.

Конечно, ваш комментарий будет указывать на то же самое, но проблема в том, что комментарии могут лгать.Если кто-то изменит ваш код, а не ваш комментарий, чтобы принять объект ClassC (например) вместо ClassA, это приведет к некоторой путанице.Представьте себе такую ​​кодовую базу.

Я видел вводящий в заблуждение комментарий, создающий неприятные ошибки.Более одного раза.

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

Вывод: я бы посоветовал вам использовать скалярные и возвращаемые типы и не бояться оператора use.

Чтобы немного объяснить, почему пространства имен были введены в PHP:

Пространства имен позволяют вам иметь разные классы с одинаковыми именами, расположенные в разных файловых путях, без коллизий имен.Если у вас есть два класса с именем ClassA, как интерпретатор может узнать, какой ClassA вы хотите использовать?

Поскольку ваши два класса с одинаковыми именами должны находиться в разных папках, ваши пространства имен будут отличаться.PHP будет знать, какой класс использовать.Это не имеет ничего общего с созданием классов.

До пространства имен у вас было несколько неприятных имен классов, таких как Mage_Application1_Entity_Model.php, описывающих путь к файлу.Гадкий как черт.

...