Изящные методы на “случайных служебных функциях”, [закрытых]

9
задан Peter Mortensen 19 February 2011 в 22:42
поделиться

5 ответов

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

if(false === function_exists('lcfirst'))
{
    function lcfirst( $str ) { /* ... */}
}

Functions like this could go in a compatibility.php, который будет включен в файл bootstrap, так что они доступны во всем приложении, и проверка function_exists гарантирует, что я не столкнусь с проблемами после того, как версия PHP будет иметь нативную поддержку этой функции.

Для всех остальных функций я бы сначала попробовал посмотреть, не могут ли они перейти на выделенный объект. Обычно "случайные" функции просто неуместны. Посмотрите, какие объекты используют функции вашей утилиты, а затем посмотрите, можно ли переместить туда методы. Может быть, там есть суперкласс, который ждет выхода. Также смотрите Information Expert pattern .

Если нет объектов, которые эти методы могут продолжать, то их все равно можно сгруппировать в статическом модуле с именем Utils в уникальном пространстве имён, чтобы они не загромождали глобальное пространство имён. Таким образом, вы можете быть уверены, что не столкнетесь с другими сторонними функциями в глобальном пространстве имён.

До версии 5.3 я бы сгруппировал их , следуя конвенции об именах PEAR и префиксом имен классов, следуя структуре ваших папок, например, если бы модуль находился в com/mattmueller/utils.php, вы бы использовали

class Com_MattMueller_Utils
{
     public static function something($a, $b) { /* ... */ }
}

Начиная с PHP5. 3, у нас есть реальные пространства имен и вы можете сделать

namespace com\mattmueller\Utils;

class Utils
{
    public static function something($a, $b) { /* ... */ }
}

В Javascript вы не имеете пространств имен, но можете легко имитировать их добавлением функций в объект, например

// JavaScript
var com = (com) ? com : {};
com.mattmueller = {
    'Utils': {
        'something' : function(a,b) { /* ... */ }
     }
};

Обычно общие фреймворки также реализуют функции для создания пространств имен.

7
ответ дан 4 December 2019 в 13:47
поделиться

В JavaScript создайте новый файл и сгруппируйте его под объектом

global.js :

/* Function definitions */ 
var myFunctions = new Object();
myFunctions.func = function () {
   alert("hello"); 
}

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

1
ответ дан 4 December 2019 в 13:47
поделиться

Для Javascript я обнаружил, что первым выбором должна быть интеграция моих утилит в jQuery. Это так же просто, как написать любую другую функцию, а когда все становится сложнее, здорово иметь возможность использовать парадигму, которую jQuery накладывает на все (и на весь мой другой код для конкретной страницы на сайте).

1
ответ дан 4 December 2019 в 13:47
поделиться

Я обычно резервирую functions.php или common.php для всех моих странных функций, которые должны иметь в идеале было в первую очередь на PHP. (Имеется в виду, совсем не относящийся к моему проекту).

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

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


Для конкретных проектов я использую класс Misc , который содержит действительно странные вызовы функций, которые, в то же время, относятся к конкретному проекту.


Я могу представить, что к функциям Javascript применимо то же самое. Если вы хотите создать файл типа functions.js или global.js , вы, вероятно, можете использовать ту же логику.

4
ответ дан 4 December 2019 в 13:47
поделиться

Я всегда использую вспомогательный класс, куда могу поместить весь свой не ООП код, LOL. Я имею в виду, что это путь помощников, которые все еще являются OOO и имеют методы вместо функций, с тем преимуществом, что вы можете организовать свои функции в разрозненных помощниках. Например, StringHelper, DBHelper и т.д..

2
ответ дан 4 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: