Ответ 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
Надеемся, что это поможет вдохновить некоторых решений тем, кто достигает пространства имен.