Подтвердить что ты не робот

В пространство имен PHP или не в пространство имен PHP

ok, я относительно новичок в программировании на PHP и плохо разбираюсь в том, что на самом деле можно использовать пространства имен в PHP, как я могу в С# и т.д.

Это действительно уродливо, хотя они решили использовать обратную косую черту - почему!?

В любом случае, меня интересуют представления других программистов PHP о том, будут ли пространства имен зависеть в PHP и должен ли я начать их использовать сейчас?

4b9b3361

Ответ 1

Вот некоторые попытки решения для тех, кто задается вопросом о функциональности пространства имен, без php 5.3.

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

Функциональность пространства имен может потребоваться, если, например, вы создаете плагины wordpress, используя в них свою библиотеку функций. Обычно вы не можете иметь несколько плагинов с объявлениями функций одних и тех же функций, это приведет к фатальным ошибкам.

РЕШЕНИЕ 1: префикс всех ваших библиотечных функций с помощью имени_плагина _ или пространства имен _

 function str_len_utf8($str)

становится

 function photoplugin_str_len_utf8($str)

Это просто вопрос поиска-замены. Легко, если функции уже имеют префикс однозначно:

john_str_len_utf8() => photoplugin_john_str_len_utf8()

Хорошо для души, поддерживает эго, "библиотеку строк johns": D

Если вы выбираете короткие и приятные префиксы с некоторым здравым смыслом, он работает как шарм, как говорится.

РЕШЕНИЕ 2: включает все функции библиотеки/повторного использования в классе.

class photopluginlib
     {
     function str_len_utf8($a){ $a=$this->str_clean_utf8($a); ...}
     ...
     }

Все вызовы функций класса в класс имеют префикс $this- > . Как только этот класс подготовлен, его можно использовать повторно без поиска-замены, достаточно изменить имя класса. Использование:

$photopluginlib=new photopluginlibrary();
$b=$photopluginlib->str_len_utf8($a);

РЕШЕНИЕ 3: заключите все функции библиотеки/повторного использования в классе и используйте:: operator

class photopluginlib
     {
     static function str_len_utf8($a){ $a=self::str_clean_utf8($a); ...}
     ...
     }

Все объявления функций в классе имеют ключевое слово static перед функцией.

Все вызовы функций внутри класса классу имеют префикс self::

Как только этот класс подготовлен, его можно использовать без поиска. Имя класса - это пространство имен, вроде. Одно только изменяет имя класса и использует его как таковое.

$b=photopluginlib::str_len_utf8($a);
$c=photopluginlib::database_row(...)

Нет необходимости создавать экземпляр класса.

Выглядит лучше, чем $photopluginlib- > str_len_utf8(), но я по-прежнему предпочитаю photoplugin_john_str_len_utf8()

Примечания

  • все библиотеки должны войти в 1 объявление класса большой библиотеки, вы практически не можете добавлять методы к классам позже в php.
  • вы не можете просто объявлять новые функции библиотеки здесь и там в разных php файлах.
  • Если используются несколько библиотек, и они используют друг друга, им необходимо использовать вызовы self:: для функций.
  • php5.2.17, общий 2013, не принимает call_user_func('photopluginlib::functionname'), нужно использовать call_user_func(Array('photopluginlib','functionname')) или внутри класса, call_user_func(Array(__CLASS__,'functionname')), что означает переписывание кода для wp add_action, preg_replace_callback и т.д.
  • требуется php >= 5
  • не может смешивать объявления кода и функций, как в:

class photopluginlib{ add_filter('html','myfilter'); static function myfilter($html){return ''} }

  • Для большого кода он может быстро стать большим сложным уклоном.

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

Эти решения все еще означают, что нужно префикс всех функций. Функциональность пространства имен означает, что можно использовать функции без их префикса, префикс будет только один раз, при запуске php файла:

<?php
namespace photoplugin;
...
$b=str_len_utf8($a);

Кстати, обновление до php5.3 имеет дополнительное преимущество, если вы можете отказаться от кода для php5.2 (все еще везде, в 2013 году) Php5.3 vs php 5.2.17 означает мгновенное увеличение скорости. Похоже, что процент увеличения скорости 30% и т.д., Не учитывая сторону базы данных:

http://onlinephpfunctions.com/benchmarks

Надеемся, что это поможет вдохновить некоторых решений тем, кто достигает пространства имен.

Ответ 2

Его использование уже улавливается. Несколько проектов используют его в своих будущих/бета-версиях. Большинство примеров, которые я видел, однако, используют его как кусок груза. Например, Doctrine2 использует пять или более вложенных пространств имен (запах кода), возможно, чтобы обеспечить сопоставление пространства имен/класса в 1:1 в файловой системе/каталогах. Я предполагаю, что новинка делает пространства имен PHP склонными к необоснованному чрезмерному использованию.

Во всяком случае, синтаксис не очень облегчает чтение. И это большой отключение для профессиональных программистов. Но если в вашем проекте есть серьезный прецедент, просто идите. (Гипотетические конфликты имен - это не лучшая причина.)

Ответ 3

Они, скорее всего, не поймают, пока ядро ​​не начнет их использовать (возможно, возможно, в PHP 7), но с помощью Python в течение нескольких месяцев покажет вам, что пространства имен AWESOME.

Ответ 4

Если ваш код не работает на ваших собственных серверах, он слишком рано, чтобы начать использовать их в качестве 5.3, является относительно новым.

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

Ответ 5

Я бы начал изучать, как использовать пространства имен как можно скорее. Zend Framework 2.0 будет использовать пространства имен, что будет означать, что любому, кто использует PHP 5.2 или ниже, будет не повезло. Я использую виртуальный выделенный сервер, поэтому я могу контролировать свою версию PHP. Если вы используете cPanel/WHM, вы можете легко установить PHP 5.3. Если вы находитесь на общедоступном хостинге, это может быть немного до того, как вы увидите 5.3 установленный, хотя там есть 5.3 усыновителей.

Ответ 6

Пространство имен не требуется для PHP.

Например, в С# и Java обычно используется несколько библиотек (особенно стандартных), и каждая библиотека содержит тысячи классов и определений для каждой библиотеки. Таким образом, вероятность конфликта высока.

Вместо этого, в PHP отличается, нам не нужно загружать несколько библиотек, не более чем фреймворк плюс некоторые отделяет .php файлы. Как работает PHP, препятствует загрузке больших библиотек, но для использования минимального минимума. Именно поэтому вероятность конфликта имен довольно туманна. Кроме того, фреймворки приправлены к использованию короткого префикса, например Wp_User (Wordpress).