Регистрация или образец Синглтона в PHP?

Я работаю с классами PHP и объектами теперь. В этом вопросе названия полей и методов составлены именно так, Вы понимаете то, о чем я говорю.

Это связано с использованием шаблоны регистрации и единичный предмет.

Теперь позволяет, говорят, что я должен получить доступ к объекту Базы данных, Объекту Тайника, Основному объекту Параметров настройки, объекту Сессии почти в любом классе, у меня должен будет быть доступ к ним. ТАКИМ ОБРАЗОМ, я использовал бы регистрацию, чтобы сохранить всех 4 из тех, возражают в 1 объект класса регистрации. Я мог тогда легко просто пройти в своем 1 объекте в любой другой объект, который должен получить доступ к ним. Таким образом, это звучит великолепно до сих пор, но что, если у меня есть некоторые классы, которым не нужны все 4 из тех объектов, что, Если я ТОЛЬКО должен получить доступ к объекту Базы данных или объекту Сессии в некоторых моих других классах? Для работы было бы лучше просто использовать единичный предмет в этих других объектах, или это будет то же, чтобы идти вперед и использовать мою регистрацию в них?

Я не знаю достаточно хорошо, как объекты работают в PHP, чтобы знать, был ли какой-либо вид выгоды performnce (меньше использования памяти, использования CPU, время загрузки).

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

10
задан JasonDavis 20 January 2010 в 14:20
поделиться

2 ответа

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

property kFileList : {}

tell application "Finder"
    set source_folder to choose folder with prompt "Please select directory."
    my createList(source_folder)
end tell

on createList(item_list)
    set the the_items to list folder item_list without invisibles
    set item_list to item_list as string
    repeat with i from 1 to number of items in the the_items
        set the_item to item i of the the_items
        set the_item to (item_list & the_item) as alias
        set this_info to info for the_item
        set file_name to name of this_info
        set end of kFileList to file_name
        if folder of this_info is true then
            my createList(the_item)
        end if
    end repeat
end createList

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

Обновление: В результате этого обсуждения вот функция снова, но на этот раз используя обновленные API. Это может, вероятно, могло бы использовать некоторую уборку, но он работает достаточно, чтобы каталогизировать мой рабочий стол (и это глубокая, глубокая папка для меня):

property kFileList : {}

tell application "Finder"
    set source_folder to choose folder with prompt "Please select directory."
    my createList(source_folder)
end tell

return kFileList

on createList(mSource_folder)
    set item_list to ""

    tell application "System Events"
        set item_list to get the name of every disk item of mSource_folder
    end tell

    set item_count to (get count of items in item_list)

    repeat with i from 1 to item_count
        set the_properties to ""

        set the_item to item i of the item_list
        set the_item to ((mSource_folder & the_item) as string) as alias

        tell application "System Events"
            set file_info to get info for the_item
        end tell

        if visible of file_info is true then
            set file_name to displayed name of file_info
            set end of kFileList to file_name
            if folder of file_info is true then
                my createList(the_item)
            end if
        end if

    end repeat
end createList

Я должен быть подписан на неправильные списки рассылки или отсутствуют, потому что эти изменения API были приняты И я никогда не раз слышал о них. Я использовал свой первый предложенный метод в десятках проектах в основном, потому что это был код, ориентированный на Apple, и полное отсутствие ошибок, использующих это (даже во время этого письма), никогда не вызывающую необходимость для меня, чтобы сообщить Отказ

VericaBout - это справедливая игра, и мои извинения за злобный недостаток в MMCGRAIL, и я заменяю его с помощью UPVote. Просто чтобы быть понятным, я никогда не думал, что ответ, данный MMCGrail был неправ. Это отличный одноранговый метод удобства, но я остался подальше от моих комментариев, уже данных. Но скорее, это было его голосование и его заявил контекст, с которым я обидел. В конце концов, это просто код, и я думаю, что мы все здесь по той же причине: найти лучший способ сделать то, что мы делаем. Кажется, у меня теперь есть несколько обновлений, чтобы вписать.

ура

-121--3579268-

, который зависит от вашего приложения. Если вам все еще нужно 3 из 4 классов, то будет более идеальным, чтобы использовать реестр, чем для обработки 3 независимо только потому, что вам не нужен четвертый. Загрузка классов Lazily будет одним из подходов к снижению следа памяти, но затем вам нужно проинструктировать реестра, когда создать объекты, и это не сильно отличается от обработки синглтонов. В качестве альтернативы вы можете создать конструктор N-параметра или использовать массив, чтобы проинструктировать ваш реестр, который классы для создания инстанции во время строительства.

class Registry {
    public $class1;
    public $class2;

    function __construct($uses) {
        foreach($uses as $class) {
            $this->{$class} = new {$class}();
        }
    }

}

Затем создать свой реестр, указав какие классы для создания инстанции.

$reg = new Registry(array('class1'));

Вы, очевидно, хотите, чтобы ваш конструктор обрабатывал нулевые параметры для учетной записи всех классов по умолчанию.

3
ответ дан 4 December 2019 в 02:26
поделиться

Вы можете реализовать ленивую загрузку, чтобы загрузить только объекты, которые вам действительно нужны:

class Registry
{
    private static $database = null;

    private static function connectDatabase($key)
    {
        [... do connection stuff ...]
    }

    public static function getDatabase($key)
    {
        if (Registry::$database == null)
        {
            Registry::connectDatabase($key);
        }
        return Registry::$database;
    }
}

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

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

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