Константа NAMESPACE_SEPARATOR - PullRequest
       14

Константа NAMESPACE_SEPARATOR

5 голосов
/ 18 мая 2010

Хорошо иметь пространства имен в PHP.Иметь '\' в качестве разделителя пространства имен немного ... неудобно (но если кто-то считает, что это круто и сексуально, я добавляю тег "rant" в этот пост.;).

Итак, возникает вопрос:

Используете ли вы в своем коде константу NAMESPACE_SEPARATOR?Как в приведенном ниже коде:

<?php

if (!\defined('NAMESPACE_SEPARATOR') {

    \define('NAMESPACE_SEPARATOR', '\\');

} // if

Плюсы:

  • в соответствии с DIRECTORY_SEPARATOR (который используют все из нас;)
  • нетбеспорядок с побегом (представьте себе '\ Foo \ Bar' , но '\\'. Foo '.' \\ '.' Bar ')
  • более читабельным(ИМХО)
  • , что дает нам возможность написать хорошие автозагрузчики с поддержкой пространства имен
  • может противостоять другим изменениям, если что-то пугает (как в случае с ol'good '::' из PHP6 альфа) * ​​1025 *
  • может скрыть уникальность '\' как оператора пространства имен на земле программирования от чужих;)

Минусы:

  • "ПричинаDIRECTORY_SEPARATOR означает, что значение зависит от платформы, а разделитель пространства имен - нет. "(как указано в http://bugs.php.net/bug.php?id=43046)
  • 19 символов вместо 1 ( \ ) или 4 ( '\\' )
  • Есть места, где вы не можете использовать это (полные имена классов в качестве переменных класса по умолчанию), например:

    <?php
    
    class A {
    
        protected $sDefaultReporterClass = '\My\Namespace\DefaultReporter';
    
    }
    

Итак, что вы думаете?

Ответы [ 3 ]

6 голосов
/ 04 апреля 2012

Да, это ответ на ваш вопрос. Я использую самоопределенный NAMESPACE_SEPARATOR, потому что

str_replace(NAMESPACE_SEPARATOR, DIRECTORY_SEPARATOR, $classFileName);

мне понятнее, чем

str_replace('\\', DIRECTORY_SEPARATOR, $classFileName);

Он может использоваться только в моих автозагрузчиках, но я хочу быстро понять код, если мне случится прочитать его через несколько лет.

6 голосов
/ 18 мая 2010

Я не уверен, что понял вашу точку зрения ... PHP-константы не похожи на макросы препроцессора C. Вы не можете создать макрос и заменить оператор на него - он просто не будет работать:

<?php
define('ADD', '+');
echo (3 ADD 5); // Parse error: syntax error, unexpected T_STRING
?>

Даже если это сработало, какова цель? Скрытие синтаксиса языка, чтобы он выглядел как другой язык, с которым вы более знакомы, - пустая трата времени, не говоря уже о том, что другим программистам становится сложнее работать над проектом. Если вы думаете, что язык X выглядит круче, просто код X, а не PHP:)

Обновление

Использование разделителя пространства имен в местах, где требуется быть строкой (такие как автозагрузчики и обратные вызовы), не представляет особых трудностей при использовании одинарных кавычек, поскольку единственные места, где его необходимо экранировать, находятся непосредственно перед кавычкой или другой обратной косой чертой, поэтому можно записать как есть:

$callback = 'Foo\Bar';

Все остальные параметры выглядят для меня ненужной сложностью:

$callback = "Foo\\Bar";
$callback = 'Foo' . NAMESPACE_SEPARATOR . 'Bar';
$callback = "Foo{$namespace_separator}Bar";
1 голос
/ 23 августа 2014

Эта проблема теперь более или менее решена с помощью нового (PHP> 5.5) подхода к именам классов с использованием разрешения имен классов (в PHP RFC это называлось скалярами имен классов ).

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

Как то, как это отвечает на первоначальный вопрос: иногда константа-разделитель пространства имен полезна для очень специфических частей вашего кода, хотя я встречал меньше мест, где бы я фактически использовал ее.

В вашем примере вы бы предпочли использовать:

<?php

namespace My\Namespace;

class A {
    protected $sDefaultReporterClass = DefaultReporter::class;
// or
    protected $sAnotherReporterClass = \Other\Namespace\Reporter::class;
}

Когда масштабы этой проблемы настолько малы, что она будет использоваться только в определенной части кода, это, вероятно, не узаконит встроенную константу PHP. Если это так, другие операторы, такие как оператор области видимости, также должны быть включены в качестве константы. Константа PAAMAYIM_NEKUDOTAYIM для "::"? (Простите за маленький постоянный псевдоним)

Не реализованной функцией PHP, которая может пригодиться после такого подхода, будет магическая константа пространства имен ::. 1016 *

...