Пишем пространства с большой буквы в Yii 2.0

    Не так давно вышла первая альфа Yii 2, уже можно знакомится подробнее с ним.

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

    Схожий случай с нескончаемой войной «пробелы vs. табуляция». Нам просто говорят: «Смиритесь с этим, не парьтесь».

    ОК. Стараюсь смирится. Даже первое время получалось, кого интересует что там внутри фреймворка. Но ничего не получается.

    namespace app\controllers;
    
    use yii\web\Controller;
    use Zend\Barcode\Barcode;
    
    class SiteController extends Controller
    {
    }
    

    Мне не комфортно когда в приложении вот такой вот бардак.

    Пробелы и табуляцию можно взаимо заменить. Git hooks или IDE сделает это очень быстро. С пространствами сложнее, но нас же это не остановит :)

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

    spl_autoload_register(function ($class) {
    	if (0 === strncmp($class, 'Yii\\', 4)) {
    		$pos = strrpos($class, '\\');
    		$parts = explode('\\', substr($class, 0, $pos));
    		array_walk(
    			$parts,
    			function (&$item) {
    				$item = lcfirst($item);
    			}
    		);
    		spl_autoload_call(
    			implode('\\', $parts) . '\\' . substr($class, $pos + 1)
    		);
    
    		return true;
    	}
    
    	return false;
    });
    

    Код лежит в репозитории, если вы используете Composer, можете добавить следующую зависимость

    "repositories": [
    	{
    		"type": "package",
    		"package": {
    			"name": "slavcodev/ucfirst-namespace",
    			"version": "dev-master",
    			"source": {
    				"type": "git",
    				"url": "https://github.com/slavcodev/yii2-ucfirst-namespace.git",
    				"reference": "master"
    			},
    			"autoload": {
    				"files": ["autoload.php"]
    			}
    		}
    	}
    ],
    "require": {
    	"php": ">=5.4.0",
    	"ext-intl": "*",
    	"yiisoft/yii2": "*",
    	"slavcodev/ucfirst-namespace": "*"
    }
    

    Все теперь у нас порядок.

    namespace App\Controllers;
    
    use Yii\Web\Controller;
    use Zend\Barcode\Barcode;
    
    class SiteController extends Controller
    {
    }
    

    P.S. Очень прошу не устраивать в комментариях холивар и не выражать свое негодование к решению разработчиков. Давайте сконцентрируемся на тексте поста, может у вас есть ко мне замечания или идеи как улучшить код. Спасибо.
    Поделиться публикацией

    Похожие публикации

    Комментарии 23

      +3
      Ага, всё круто. НО вот представьте ситуацию:
      Вы написали приложение (а то и с десяток) с этим автолоадером и стилем которого не придерживается Yii,
      а потом решили работать с коллегами вместе, которые уже тоже разобрались с этим «смирились и не парятся» (реально не парятся)
      Вероятно для них это будет не удобно… не так ли?
      IMHO: для меня точно не удобно, я уже привык и не парюсь.
      Ну и с некоторыми IDE будут траблы из-за регистра.
        +2
        Если работать с коллегами вместе, то должен быть кодестайл. Почему считаете, что им будет неудобно? Я за автолоадер PSR-0, где ns с большой буквы должны быть. Насчет IDE, приведите пример.
          +1
          Такое ощущение что вы не кодите :)
          Строго говоря где в стандарте про регистр первой буквы?
          (И по мне так странно если бы это туда включили www.php-fig.org/psr/psr-0/)

          IDE пример — phpStorm — перестаёт автокомплитить.

          попробуйте use Yii\he(Ctrl+space) = No suggestion
          попробуйте use yii\he(Ctrl+space) = yii\helpers
            +1
            В PSR-0 об этом не сказано, но сказано в PSR-1.

            Class names MUST be declared in StudlyCaps.
            www.php-fig.org/psr/psr-1/


            И меня честно говоря удивляет тот факт, что авторы фреймворка не следуют принятому стандарту, при том что они состоят в группе FIG
              +2
              Class name != Namespace (тем более в самом PSR-1 «Namespaces and classes»)
                +2
                При чем тут классы вообще?
                Да и классы все с большой буквы вроде… всё чётко.
                  +2
                  Оу, точно…
                  Тогда мой наезд не засчитан, где там мой пепел для головы?)
                    0
                    В терминологии PHP нэймспейс считается частью названия класса. В частности функция get_class() возвращает имя класса с нэймспэйсом, а на php.net в описании этой функции написано так: Returns the name of the class of an object.
                    Т.е. можно сделать вывод, что для разработчиков PHP нэймспэйс — это часть имени класса.
                    Думаю, что именно по этому в PSR стандартах не написано ничего про нэймспейсы, ведь к нэймспейсам должны применяться те же правила, что и к классам.
                  0
                  Проблема только с написанием пространства, потому как
                  use Yii\Helpers\(Ctrl+space) — предлагает классы.
              +2
              Я знаю один аргумент за пространства имен с маленькой буквы. Таким образом визуально сразу распознается что есть папка-namespace, а что есть реальное короткое название класса.
                –17
                Я, как бывший олимпиадник, не могу спокойно смотреть на этот перевод ресурсов…
                if (0 === strpos($class, 'Yii\\')) {
                

                Ну почему нельзя было написать
                if ('Yii\\' === substr($class, 0, 4)) {
                
                  +3
                  1. Ваш вариант с первого взгляда менее понятный
                  2. Не поленился, проверил:

                  $class = 'Yii\\test';
                  $iterations = 100000;
                  
                  foreach (range(0, 9) as $iteration) {
                      $start = microtime(true);
                      for ($i = 0; $i < $iterations; $i++) {
                          if (0 === strpos($class, 'Yii\\')) {
                  
                          }
                      }
                      $finish = microtime(true) - $start;
                  
                      $startOlympiad = microtime(true);
                      for ($i = 0; $i < $iterations; $i++) {
                          if ('Yii\\' === substr($class, 0, 4)) {
                  
                          }
                      }
                  
                      $finishOlympiad = microtime(true) - $startOlympiad;
                  
                      var_dump($finish);
                      var_dump($finishOlympiad);
                      var_dump('-------------');
                  }
                  


                  Результат:

                  float(0.03000283241272)
                  float(0.047005176544189)
                  string(13) "-------------"
                  float(0.027001857757568)
                  float(0.036004066467285)
                  string(13) "-------------"
                  float(0.027003049850464)
                  float(0.032002925872803)
                  string(13) "-------------"
                  float(0.027003049850464)
                  float(0.034003019332886)
                  string(13) "-------------"
                  float(0.024001836776733)
                  float(0.031004190444946)
                  string(13) "-------------"
                  float(0.033002853393555)
                  float(0.035002946853638)
                  string(13) "-------------"
                  float(0.027003049850464)
                  float(0.036003828048706)
                  string(13) "-------------"
                  float(0.028002977371216)
                  float(0.033003091812134)
                  string(13) "-------------"
                  float(0.023001909255981)
                  float(0.034003973007202)
                  string(13) "-------------"
                  float(0.027002096176147)
                  float(0.029002904891968)
                  string(13) "-------------"
                  


                  Не экономьте на спичках, тем более что ваш вариант медленнее.
                    –1
                    Отлично, вы проверили лучший случай. Теперь осталось проверить худший и средний.
                    Вот худший:
                    $class = 'VeryStrangeThirdPartyLibraryName\\This\\Is\\A\\Very\\Long\\Namespace\\Path\\With\\Many\\Parts\\To\\This\\Class';
                    

                    Что, правда, делать со средним — не совсем ясно.
                      +2
                      php 5.3.22
                      float(0.025063037872314)
                      float(0.027328968048096)
                      string(13) "-------------"
                      float(0.024883985519409)
                      float(0.027305841445923)
                      string(13) "-------------"
                      float(0.024459838867188)
                      float(0.027107000350952)
                      string(13) "-------------"
                      float(0.024399995803833)
                      float(0.027168035507202)
                      string(13) "-------------"
                      float(0.024492979049683)
                      float(0.027180910110474)
                      string(13) "-------------"
                      float(0.024927854537964)
                      float(0.027140855789185)
                      string(13) "-------------"
                      float(0.024561166763306)
                      float(0.027137041091919)
                      string(13) "-------------"
                      float(0.024441957473755)
                      float(0.027230024337769)
                      string(13) "-------------"
                      float(0.024482011795044)
                      float(0.027484893798828)
                      string(13) "-------------"
                      float(0.024868011474609)
                      float(0.027168989181519)
                      string(13) "-------------"
                      


                      Не думаю, что у нас тут будет когда-либо затык, так что спор в любом случае безсмысленный.
                        0
                        (В продолжение нанооптимизаторских бесед) Тестировать лучше на 5.4+ — он умеет интернировать строки ;)
                          +1
                          Странные какие-то времена… Ну да ладно, не буду спорить, PHP — не мой язык.
                      +7
                      Оптимизация из серии «если утром встать с правильно ноги, то на работу будет идти на один шаг меньше».
                        0
                        Копирование и создание строки будет медленнее, если конечно у вас строка не километровая.
                          +3
                          Substr создаёт новый zval, это тоже тормоз. Правильное решение, достойное нанооптимизатора — strncmp ;)
                            0
                            О, спасибо, как-то я пропустил эту функцию при просмотре списка строковых функций.
                              0
                              Да я тоже забыл про эту функцию.
                            0
                            Оригинально, но это лишь дело предпочтений. Я использую неймспейсы только в нижнем регистре(в 1-й версии, надо об этом статью как-то написать). Только как-то топорно автолоадер вешается, в YiiBase же было что-то для этих целей…
                              –1
                              ln -s yii Yii и далее рекурсивно, шах и мат :)

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

                              Самое читаемое