Если бы можно различать количеством параметра, то что-то вроде этого работало бы:
Public Function Morph(ParamArray Args())
Select Case UBound(Args)
Case -1 '' nothing supplied
Morph = Morph_NoParams()
Case 0
Morph = Morph_One_Param(Args(0))
Case 1
Morph = Two_Param_Morph(Args(0), Args(1))
Case Else
Morph = CVErr(xlErrRef)
End Select
End Function
Private Function Morph_NoParams()
Morph_NoParams = "I'm parameterless"
End Function
Private Function Morph_One_Param(arg)
Morph_One_Param = "I has a parameter, it's " & arg
End Function
Private Function Two_Param_Morph(arg0, arg1)
Two_Param_Morph = "I is in 2-params and they is " & arg0 & "," & arg1
End Function
, Если единственный способ отличить функцию типами, то Вы эффективно оказываетесь перед необходимостью делать то, что делают C++ и другие языки с переопределенными функциями, который должен звонить подписью. Я предложил бы выполнить вызов, выглядите примерно так:
Public Function MorphBySig(ParamArray args())
Dim sig As String
Dim idx As Long
Dim MorphInstance As MorphClass
For idx = LBound(args) To UBound(args)
sig = sig & TypeName(args(idx))
Next
Set MorphInstance = New MorphClass
MorphBySig = CallByName(MorphInstance, "Morph_" & sig, VbMethod, args)
End Function
и создание класса со многими методами, которые соответствуют подписям, которые Вы ожидаете. Вам, вероятно, будет нужна некоторая обработка ошибок, хотя, и быть предупрежденным, что типы, которые являются распознаваемыми, ограничены: датами является TypeName Дважды, например.
Я могу порекомендовать Zend_Pdf , который является программным методом согласно вашей классификации.
Абстракция HTML - это хорошо, но я не верю, что у вас есть все возможности и управление полным API рисования на основе геометрии. Остерегайтесь таких библиотек, как fpdf, которые не поддерживают UTF-8 из коробки, и используйте парсер для бедняков для «преобразования» HTML в PDF.
Что касается вашего приложения, я создал систему, которая генерирует шаблонные счета-фактуры. Мои пользователи могут загрузить шаблон PDF, который извлекает Zend_Pdf. Этот шаблон затем используется для каждой страницы сгенерированного счета, что позволяет легко настраивать его.
Обратите внимание, что моя аудитория - в основном графические дизайнеры, способные создавать эти шаблоны, так что это было подходящее решение здесь.
class Application {
protected static $_singletonFoo=NULL;
public static function foo() {
if(NULL === self::$_singletonFoo) {
self::$_singletonFoo = new Foo;
}
return self::$_singletonFoo;
}
}
Я бы так и поступил. Он создает объект по запросу:
Application::foo()->bar();
Я так и делаю, он соблюдает принципы ООП, в нем меньше кода, чем то, что вы делаете сейчас, и объект создается только тогда, когда это требуется коду в первую очередь время.
Примечание : то, что я представил, даже не является настоящим одноэлементным шаблоном. Синглтон допускает только один экземпляр самого себя, определяя конструктор (Foo :: __ constructor ()) как закрытый. Это только «глобальная» переменная, доступная для всех экземпляров «Приложения». Вот почему я думаю, что его использование правильно, поскольку оно НЕ игнорирует хорошие принципы ООП. Конечно, как и все в мире, этим «шаблоном» не следует злоупотреблять!
Я видел, как он используется во многих фреймворках PHP, в том числе в Zend Framework и Yii. И вы должны использовать фреймворк. Я не собираюсь говорить вам, какой именно.
Приложение Для тех из вас, кто беспокоится о TDD , вы все равно можете сделать некоторую проводку для внедрения зависимостей. Это может выглядеть так:
class Application {
protected static $_singletonFoo=NULL;
protected static $_helperName = 'Foo';
public static function setDefaultHelperName($helperName='Foo') {
if(is_string($helperName)) {
self::$_helperName = $helperName;
}
elseif(is_object($helperName)) {
self::$_singletonFoo = $helperName;
}
else {
return FALSE;
}
return TRUE;
}
public static function foo() {
if(NULL === self::$_singletonFoo) {
self::$_singletonFoo = new self::$_helperName;
}
return self::$_singletonFoo;
}
}
Здесь достаточно возможностей для улучшения. Это просто PoC, используйте ваше воображение.
Почему это так? Что ж, в большинстве случаев приложение не будет проходить модульное тестирование, оно будет запущено , надеюсь, в производственной среде . Сила PHP - в его скорости. PHP НЕ является и никогда не будет «чистым языком ООП», как Java.
В приложении есть только один класс Application и не более одного экземпляра каждого из его помощников (согласно ленивой загрузке, как указано выше). Конечно, синглтоны - это плохо, но опять же, только если они не соответствуют реальному миру. В моем примере это так.
Стереотипные "правила" вроде " пользователь может разработать шаблон так, как он считает нужным, и вы не будете нужны, когда потребуется изменить дизайн. (И его нужно будет изменить в один прекрасный день.) Программист вступает в игру только тогда, когда вставленные данные нужно изменить или расширить. Это огромная нагрузка для вас.
Hi you have two options. You can use dompdf, which enables you to design your document as a regular html document and style it with css. You can turn this document into pdf. My experiences were good. I render a regular html page using Zend_View and turn this into pdf. This way you have an extremely flexible template, beacuse you can make all kind of display decisions in your html-generating view.
→ see the list of css-compatability.
Alternatively you could use livedocx. This also allows for a template based approach, but more rigidly and html-less. A integration for Zend Framework is on its way.
Я также рекомендую конвертировать HTML в PDF:
Когда я однажды создал генерацию PDF для веб-сайта, я использовал html2ps , а затем преобразовал постскриптум в PDF позже.
Предлагаю программное форматирование.
В мире .net у меня был явно негативный опыт использования конвертеров html в pdf. Кажется, они делятся на 2 категории:
Те, которые «анализируют» ваш html и пытаются превратить его в pdf. В них часто отсутствуют некоторые действительно фундаментальные функции, такие как таблицы стилей и поддержка чего угодно, кроме макета на основе таблиц.
Те, которые «распечатывают» ваш HTML-код на изображение и вставляют его в PDF-файл. Они действительно могут создать прилично выглядящий документ. Кажется, они работают, связывая браузер с библиотекой, что вызывает проблемы с потоками и низкую производительность.
У меня был посредственный опыт работы с прямым API-интерфейсом pdf, но php, похоже, имеет несколько значительно лучших библиотек в этом отношении.
У меня был достаточный опыт работы со всеми тремя подходами:
Создание документа программно с использованием TCPDF (который, хотя и был производным от FPDF, ДЕЙСТВИТЕЛЬНО поддерживает UTF-8 из коробки). Хотя я большой поклонник Zend Framework, необходимо отметить, что Zend_Pdf еще НЕ достаточно богат набором функций, чтобы его можно было использовать таким образом.
Графический дизайнер создает шаблон, загружает его с помощью Zend_Pdf, а затем добавляет к нему дополнительный контент. Zend_Pdf (1.10.2 - 1.10.7) в этом случае работал довольно хорошо, ЗА ИСКЛЮЧЕНИЕМ, когда при попытке создать экземпляр новой страницы и добавить ее в документ возникало множество ошибок.
Преобразование из HTML в PDF с помощью htmldoc. Этот подход был плохим, но в основном из-за ограничений в htmldoc.
Я не использовал TCPDF для конвертации HTML в PDF, но, судя по общему качеству кода, я думаю, что он вполне справится со своей задачей. (Я действительно довел TCPDF до предела, включая рендеринг графически насыщенных документов в наборах символов RTL, китайском языке и т. д., и он работал безупречно). Поэтому, если вы решите сделать это программно, я бы порекомендовал использовать TCPDF, но если у вас есть хороший шаблон от графического дизайнера и вы намерены просто добавить что-то сверху, загрузка его с помощью Zend_Pdf и модификация оттуда — разумный выбор (хотя вы все равно в конечном итоге реализуете перенос слов и некоторые другие базовые вещи).