2015-12-05 3 views
0

Я только начинаю писать часть программного обеспечения с открытым исходным кодом, которое написано процедурно как альтернатива скелетам/фреймворкам ООП mvc. Поэтому, хотя я мог бы просто написать свою собственную структуру OOP MVC, целью является сделать все это процедурно. Это предназначено для учебных целей и для целей создания готовой кодовой базы DIY при выполнении нового проекта. Я еще не полностью разбираюсь в ООП, поэтому я чувствую, что делать это так - шаг в этом направлении. Однако цель этого проекта - быть процедурной альтернативой, поэтому он должен быть написан процедурно (и я даю это предисловие, чтобы избежать ответов на использование ООП).PHP: Промежуточный код - используйте пространство имен или массив замыканий, чтобы избежать загрязнения глобального пространства имен?

После того, как я начал писать, я понимаю, что код сильно загрязняет глобальное пространство имен (например, процедурный код).

Во-первых, решить проблему загрязнения глобального пространства имен и минимизации случайных конфликтов имен, я решил префикс переменные и функции, используемые как так:

$prefix_variableName = 'value'; prefix_functionName($var){ return $var; }

Тогда я понял, есть лучшие способы сделать это. У меня есть две идеи:

1: Создайте глобальный массив замыканий. Таким образом, единственным глобальным я установил в коде есть один массив .. как так ..

$myApp = array(
    'var1' => 'value1', 
    'var2' => 'value2', 
    'function1' => function($var1){ return $var1; }, 
    'function2' => function($var2){ return $var2; } 
//etc 
); 

2: Создание пространства имен для глобального кода в верхней части каждого файла .. как ..

namespace myApp; 

$var1 = 'value1'; 
function1($msg){ return $msg; } 

Возможно ли оба варианта? Может ли процедурный код заменяться именами имен? Какой из них является лучшим вариантом для этого обстоятельства и почему? Есть ли еще варианты?

+1

«Я хочу написать проект, отличный от OO» [приступает к повторному использованию PHP OO] Проблемы, которые у вас возникают, - это точная причина для OO *. – Sammitch

+0

Я создал функцию, называемую getResource один раз. Он принял ключ (строка), объявил статический массив и возвратил false, если ключ не был в массиве. – bassxzero

+0

@sammitch, вы правы. однако, я все еще могу написать процедурный код и попытаться избежать проблем, если смогу, не так ли? Код будет не-OO, при этом максимизируя проблемы. Конечно, это барьер, но он необходим по назначению. Мой проект будет для людей, которые либо хотят писать процедурные, либо не знают OO (и мне хотелось бы, чтобы что-то подобное было доступно мне). – Scott

ответ

0

Вы, безусловно, можете использовать пространства имен для процедурного кода. Проверьте документы, чтобы узнать, как это работает: http://php.net/manual/en/language.namespaces.basics.php

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

+0

Спасибо. Распространение имен звучит как хорошая идея, кроме ... (мысль продолжается). Я думаю, мне нужно отделить то, что я здесь делаю. Установки проекта и внутреннего кода могут быть помещены в имена. Но для вещей, которые нужно использовать людям ... например, пространство имен \ MyApp \ Db \ Mysql было бы трудно вводить каждый раз, когда им нужна функция \ MyApp \ Db \ Mysql \ Query(); Это много, чтобы напечатать. Возможно, внутренние транзакции/настройка могут быть помещены в имена, а материал, который должен использоваться конечным пользователем, быть не может. Idk, я должен думать. Я думаю, idk, как я хочу это сделать. Прошу прощения за преждевременный вопрос. – Scott

+0

Я понял. Поскольку я заставляю этот проект носить процедурный характер, я должен принять недостатки, которые у него есть. Если я использую пространство имен, пользователю придется вводить слишком много для каждого вызова функции (например, я сказал, например, \ MyApp \ Db \ Mysql \ Query()). Если я использую массив замыканий, он может стать огромным массивом, с некоторыми доступными vars/функциями или не зависящими от того, включен ли файл (например, db vars/functions не будет, если я не включил db-файл). Кроме того, странный синтаксис для процедурных кодеров ($ myApp ['db'] ['query'] ($ params)). Я буду придерживаться префиксов (только MyApp_Db_Query ($ params)). – Scott

Смежные вопросы